diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c index 4dd84ed79..40a63ea7e 100644 --- a/arch/arm/lib/armlinux.c +++ b/arch/arm/lib/armlinux.c @@ -266,8 +266,6 @@ 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); diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c index 00c49086c..4decee4b0 100644 --- a/arch/arm/lib/bootm.c +++ b/arch/arm/lib/bootm.c @@ -26,7 +26,7 @@ static int __do_bootm_linux(struct image_data *data, int swap) { unsigned long kernel; - unsigned long initrd_start = 0, initrd_size = 0; + unsigned long initrd_start = 0, initrd_size = 0, initrd_end = 0; struct memory_bank *bank; unsigned long load_address; @@ -82,9 +82,18 @@ static int __do_bootm_linux(struct image_data *data, int swap) if (data->initrd_res) { initrd_start = data->initrd_res->start; + initrd_end = data->initrd_res->end; initrd_size = resource_size(data->initrd_res); } + if (IS_ENABLED(CONFIG_OFTREE) && data->of_root_node) { + of_add_initrd(data->of_root_node, initrd_start, initrd_end); + if (initrd_end) + of_add_reserve_entry(initrd_start, initrd_end); + data->oftree = of_get_fixed_tree(data->of_root_node); + fdt_add_reserve_map(data->oftree); + } + if (bootm_verbose(data)) { printf("\nStarting kernel at 0x%08lx", kernel); if (initrd_size) diff --git a/common/oftree.c b/common/oftree.c index 44ffadec3..e6c82d602 100644 --- a/common/oftree.c +++ b/common/oftree.c @@ -273,72 +273,6 @@ 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 device_node *root) { struct device_node *node;