DeviceTree: add support for initrd in the DT
Add the initrd start and end address to the DT, code comes from u-boot. Signed-off-by: Vicente Bergas <vicencb@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
c0ba0a64ae
commit
afab6ac783
|
@ -266,6 +266,8 @@ void start_linux(void *adr, int swap, unsigned long initrd_address,
|
|||
|
||||
if (oftree) {
|
||||
printf("booting Linux kernel with devicetree\n");
|
||||
fdt_initrd(oftree, initrd_address,
|
||||
initrd_address + initrd_size, 1);
|
||||
params = oftree;
|
||||
} else {
|
||||
setup_tags(initrd_address, initrd_size, swap);
|
||||
|
|
|
@ -246,6 +246,72 @@ int fdt_get_path_or_create(struct fdt_header *fdt, const char *path)
|
|||
return nodeoffset;
|
||||
}
|
||||
|
||||
int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)
|
||||
{
|
||||
int nodeoffset;
|
||||
int err, j, total;
|
||||
u32 tmp;
|
||||
const char *path;
|
||||
uint64_t addr, size;
|
||||
|
||||
/* Find the "chosen" node */
|
||||
nodeoffset = fdt_path_offset(fdt, "/chosen");
|
||||
|
||||
/* If there is no "chosen" node in the blob return */
|
||||
if (nodeoffset < 0) {
|
||||
printf("fdt_initrd: %s\n", fdt_strerror(nodeoffset));
|
||||
return nodeoffset;
|
||||
}
|
||||
|
||||
/* just return if initrd_start/end aren't valid */
|
||||
if ((initrd_start == 0) || (initrd_end == 0))
|
||||
return 0;
|
||||
|
||||
total = fdt_num_mem_rsv(fdt);
|
||||
|
||||
/*
|
||||
* Look for an existing entry and update it. If we don't find
|
||||
* the entry, we will j be the next available slot.
|
||||
*/
|
||||
for (j = 0; j < total; j++) {
|
||||
err = fdt_get_mem_rsv(fdt, j, &addr, &size);
|
||||
if (addr == initrd_start) {
|
||||
fdt_del_mem_rsv(fdt, j);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
err = fdt_add_mem_rsv(fdt, initrd_start, initrd_end - initrd_start);
|
||||
if (err < 0) {
|
||||
printf("fdt_initrd: %s\n", fdt_strerror(err));
|
||||
return err;
|
||||
}
|
||||
|
||||
path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL);
|
||||
if (!path || force) {
|
||||
tmp = __cpu_to_be32(initrd_start);
|
||||
err = fdt_setprop(fdt, nodeoffset,
|
||||
"linux,initrd-start", &tmp, sizeof(tmp));
|
||||
if (err < 0) {
|
||||
printf("WARNING: "
|
||||
"could not set linux,initrd-start %s.\n",
|
||||
fdt_strerror(err));
|
||||
return err;
|
||||
}
|
||||
tmp = __cpu_to_be32(initrd_end);
|
||||
err = fdt_setprop(fdt, nodeoffset,
|
||||
"linux,initrd-end", &tmp, sizeof(tmp));
|
||||
if (err < 0) {
|
||||
printf("WARNING: could not set linux,initrd-end %s.\n",
|
||||
fdt_strerror(err));
|
||||
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int of_fixup_bootargs(struct fdt_header *fdt)
|
||||
{
|
||||
int nodeoffset;
|
||||
|
|
|
@ -18,6 +18,14 @@ void do_fixup_by_path(struct fdt_header *fdt, const char *path, const char *prop
|
|||
void do_fixup_by_path_u32(struct fdt_header *fdt, const char *path, const char *prop,
|
||||
u32 val, int create);
|
||||
int fdt_get_path_or_create(struct fdt_header *fdt, const char *path);
|
||||
#ifdef CONFIG_FDT
|
||||
int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force);
|
||||
#else
|
||||
static inline int fdt_initrd(void *fdt, ulong start, ulong end, int force)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define OF_BAD_ADDR ((u64)-1)
|
||||
|
||||
|
|
Loading…
Reference in New Issue