fdt: refactor initrd related code
Created a new fdt_initrd() to deal with setting the initrd properties in the device tree and fixing up the mem reserve. We can use this both in the choosen node handling and lets us remove some duplicated code when we fixup the initrd info in bootm on PPC. Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
This commit is contained in:
parent
3082d2348c
commit
2a1a2cb6e2
@ -99,11 +99,76 @@ static int fdt_fixup_stdout(void *fdt, int chosenoff)
|
||||
}
|
||||
#endif
|
||||
|
||||
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 + 1);
|
||||
if (err < 0) {
|
||||
printf("fdt_initrd: %s\n", fdt_strerror(err));
|
||||
return err;
|
||||
}
|
||||
|
||||
path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL);
|
||||
if ((path == NULL) || 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;
|
||||
}
|
||||
|
||||
int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force)
|
||||
{
|
||||
int nodeoffset;
|
||||
int err;
|
||||
u32 tmp; /* used to set 32 bit integer properties */
|
||||
char *str; /* used to set string properties */
|
||||
const char *path;
|
||||
|
||||
@ -113,30 +178,6 @@ int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (initrd_start && initrd_end) {
|
||||
uint64_t addr, size;
|
||||
int total = fdt_num_mem_rsv(fdt);
|
||||
int j;
|
||||
|
||||
/*
|
||||
* 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 + 1);
|
||||
if (err < 0) {
|
||||
printf("fdt_chosen: %s\n", fdt_strerror(err));
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the "chosen" node.
|
||||
*/
|
||||
@ -173,24 +214,8 @@ int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force)
|
||||
fdt_strerror(err));
|
||||
}
|
||||
}
|
||||
if (initrd_start && initrd_end) {
|
||||
path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL);
|
||||
if ((path == NULL) || 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));
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
fdt_initrd(fdt, initrd_start, initrd_end, force);
|
||||
|
||||
#ifdef CONFIG_OF_STDOUT_VIA_ALIAS
|
||||
path = fdt_getprop(fdt, nodeoffset, "linux,stdout-path", NULL);
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <fdt.h>
|
||||
|
||||
int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force);
|
||||
int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force);
|
||||
void do_fixup_by_path(void *fdt, const char *path, const char *prop,
|
||||
const void *val, int len, int create);
|
||||
void do_fixup_by_path_u32(void *fdt, const char *path, const char *prop,
|
||||
|
@ -182,32 +182,8 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
|
||||
|
||||
#if defined(CONFIG_OF_LIBFDT)
|
||||
/* fixup the initrd now that we know where it should be */
|
||||
if ((of_flat_tree) && (initrd_start && initrd_end)) {
|
||||
uint64_t addr, size;
|
||||
int total = fdt_num_mem_rsv(of_flat_tree);
|
||||
int j;
|
||||
|
||||
/* Look for the dummy entry and delete it */
|
||||
for (j = 0; j < total; j++) {
|
||||
fdt_get_mem_rsv(of_flat_tree, j, &addr, &size);
|
||||
if (addr == images->rd_start) {
|
||||
fdt_del_mem_rsv(of_flat_tree, j);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ret = fdt_add_mem_rsv(of_flat_tree, initrd_start,
|
||||
initrd_end - initrd_start + 1);
|
||||
if (ret < 0) {
|
||||
printf("fdt_chosen: %s\n", fdt_strerror(ret));
|
||||
goto error;
|
||||
}
|
||||
|
||||
do_fixup_by_path_u32(of_flat_tree, "/chosen",
|
||||
"linux,initrd-start", initrd_start, 0);
|
||||
do_fixup_by_path_u32(of_flat_tree, "/chosen",
|
||||
"linux,initrd-end", initrd_end, 0);
|
||||
}
|
||||
if ((of_flat_tree) && (initrd_start && initrd_end))
|
||||
fdt_initrd(of_flat_tree, initrd_start, initrd_end, 1);
|
||||
#endif
|
||||
debug ("## Transferring control to Linux (at address %08lx) ...\n",
|
||||
(ulong)kernel);
|
||||
|
Loading…
Reference in New Issue
Block a user