/* Top level function that updates the device tree. */ int update_device_tree(void *fdt, const char *cmdline, void *ramdisk, uint32_t ramdisk_size) { int ret = 0; uint32_t offset; /* Check the device tree header */ ret = fdt_check_header(fdt); if (ret) { dprintf(CRITICAL, "Invalid device tree header \n"); return ret; } /* Add padding to make space for new nodes and properties. */ ret = fdt_open_into(fdt, fdt, fdt_totalsize(fdt) + DTB_PAD_SIZE); if (ret!= 0) { dprintf(CRITICAL, "Failed to move/resize dtb buffer: %d\n", ret); return ret; } /* Get offset of the memory node */ ret = fdt_path_offset(fdt, "/memory"); if (ret < 0) { dprintf(CRITICAL, "Could not find memory node.\n"); return ret; } offset = ret; ret = target_dev_tree_mem(fdt, offset); if(ret) { dprintf(CRITICAL, "ERROR: Cannot update memory node\n"); return ret; } /* Get offset of the chosen node */ ret = fdt_path_offset(fdt, "/chosen"); if (ret < 0) { dprintf(CRITICAL, "Could not find chosen node.\n"); return ret; } offset = ret; /* Adding the cmdline to the chosen node */ ret = fdt_setprop_string(fdt, offset, (const char*)"bootargs", (const void*)cmdline); if (ret) { dprintf(CRITICAL, "ERROR: Cannot update chosen node [bootargs]\n"); return ret; } /* Adding the initrd-start to the chosen node */ ret = fdt_setprop_u32(fdt, offset, "linux,initrd-start", (uint32_t)ramdisk); if (ret) { dprintf(CRITICAL, "ERROR: Cannot update chosen node [linux,initrd-start]\n"); return ret; } /* Adding the initrd-end to the chosen node */ ret = fdt_setprop_u32(fdt, offset, "linux,initrd-end", ((uint32_t)ramdisk + ramdisk_size)); if (ret) { dprintf(CRITICAL, "ERROR: Cannot update chosen node [linux,initrd-end]\n"); return ret; } fdt_pack(fdt); return ret; }
/* Top level function that updates the device tree. */ int update_device_tree(void *fdt, const char *cmdline, void *ramdisk, uint32_t ramdisk_size) { int ret = 0; uint32_t offset; /* Check the device tree header */ ret = fdt_check_header(fdt); if (ret) { dprintf(CRITICAL, "Invalid device tree header \n"); return ret; } /* Get offset of the memory node */ ret = fdt_path_offset(fdt, "/memory"); if (ret < 0) { dprintf(CRITICAL, "Could not find memory node.\n"); return ret; } offset = ret; ret = target_dev_tree_mem(fdt, offset); if(ret) { dprintf(CRITICAL, "ERROR: Cannot update memory node\n"); return ret; } /* Get offset of the chosen node */ ret = fdt_path_offset(fdt, "/chosen"); if (ret < 0) { dprintf(CRITICAL, "Could not find chosen node.\n"); return ret; } offset = ret; /* Adding the cmdline to the chosen node */ ret = fdt_setprop_string(fdt, offset, (const char*)"bootargs", (const void*)cmdline); if (ret) { dprintf(CRITICAL, "ERROR: Cannot update chosen node [bootargs]\n"); return ret; } /* Adding the initrd-start to the chosen node */ ret = fdt_setprop_u32(fdt, offset, "linux,initrd-start", (uint32_t)ramdisk); if (ret) { dprintf(CRITICAL, "ERROR: Cannot update chosen node [linux,initrd-start]\n"); return ret; } /* Adding the initrd-end to the chosen node */ ret = fdt_setprop_u32(fdt, offset, "linux,initrd-end", ((uint32_t)ramdisk + ramdisk_size)); if (ret) { dprintf(CRITICAL, "ERROR: Cannot update chosen node [linux,initrd-end]\n"); return ret; } fdt_pack(fdt); return ret; }