int fdt_chosen(void *fdt) { int nodeoffset; int err; char *str; /* used to set string properties */ err = fdt_check_header(fdt); if (err < 0) { printf("fdt_chosen: %s\n", fdt_strerror(err)); return err; } /* find or create "/chosen" node. */ nodeoffset = fdt_find_or_add_subnode(fdt, 0, "chosen"); if (nodeoffset < 0) return nodeoffset; str = env_get("bootargs"); if (str) { err = fdt_setprop(fdt, nodeoffset, "bootargs", str, strlen(str) + 1); if (err < 0) { printf("WARNING: could not set bootargs %s.\n", fdt_strerror(err)); return err; } } return fdt_fixup_stdout(fdt, nodeoffset); }
int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end) { int nodeoffset; int err, j, total; int is_u64; uint64_t addr, size; /* just return if the size of initrd is zero */ if (initrd_start == initrd_end) return 0; /* find or create "/chosen" node. */ nodeoffset = fdt_find_or_add_subnode(fdt, 0, "chosen"); if (nodeoffset < 0) return nodeoffset; 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; } is_u64 = (fdt_address_cells(fdt, 0) == 2); err = fdt_setprop_uxx(fdt, nodeoffset, "linux,initrd-start", (uint64_t)initrd_start, is_u64); if (err < 0) { printf("WARNING: could not set linux,initrd-start %s.\n", fdt_strerror(err)); return err; } err = fdt_setprop_uxx(fdt, nodeoffset, "linux,initrd-end", (uint64_t)initrd_end, is_u64); if (err < 0) { printf("WARNING: could not set linux,initrd-end %s.\n", fdt_strerror(err)); return err; } return 0; }
int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks) { int err, nodeoffset; int len, i; u8 tmp[MEMORY_BANKS_MAX * 16]; /* Up to 64-bit address + 64-bit size */ if (banks > MEMORY_BANKS_MAX) { printf("%s: num banks %d exceeds hardcoded limit %d." " Recompile with higher MEMORY_BANKS_MAX?\n", __FUNCTION__, banks, MEMORY_BANKS_MAX); return -1; } err = fdt_check_header(blob); if (err < 0) { printf("%s: %s\n", __FUNCTION__, fdt_strerror(err)); return err; } /* find or create "/memory" node. */ nodeoffset = fdt_find_or_add_subnode(blob, 0, "memory"); if (nodeoffset < 0) return nodeoffset; err = fdt_setprop(blob, nodeoffset, "device_type", "memory", sizeof("memory")); if (err < 0) { printf("WARNING: could not set %s %s.\n", "device_type", fdt_strerror(err)); return err; } for (i = 0; i < banks; i++) { if (start[i] == 0 && size[i] == 0) break; } banks = i; if (!banks) return 0; for (i = 0; i < banks; i++) if (start[i] == 0 && size[i] == 0) break; banks = i; len = fdt_pack_reg(blob, tmp, start, size, banks); err = fdt_setprop(blob, nodeoffset, "reg", tmp, len); if (err < 0) { printf("WARNING: could not set %s %s.\n", "reg", fdt_strerror(err)); return err; } return 0; }
int fdt_record_loadable(void *blob, u32 index, const char *name, uintptr_t load_addr, u32 size, uintptr_t entry_point, const char *type, const char *os) { int err, node; err = fdt_check_header(blob); if (err < 0) { printf("%s: %s\n", __func__, fdt_strerror(err)); return err; } /* find or create "/fit-images" node */ node = fdt_find_or_add_subnode(blob, 0, "fit-images"); if (node < 0) return node; /* find or create "/fit-images/<name>" node */ node = fdt_find_or_add_subnode(blob, node, name); if (node < 0) return node; /* * We record these as 32bit entities, possibly truncating addresses. * However, spl_fit.c is not 64bit safe either: i.e. we should not * have an issue here. */ fdt_setprop_u32(blob, node, "load-addr", load_addr); if (entry_point != -1) fdt_setprop_u32(blob, node, "entry-point", entry_point); fdt_setprop_u32(blob, node, "size", size); if (type) fdt_setprop_string(blob, node, "type", type); if (os) fdt_setprop_string(blob, node, "os", os); return node; }
static int boot_fdt_setprop(void *blob) { int node; char new_prop[CONFIG_SYS_BARGSIZE]; char *s; s = getenv("bootargs"); strcpy(new_prop, s); node = fdt_find_or_add_subnode(blob, 0, "chosen"); if (node < 0){ printf("error when find chosen node: %d", node); return -1; } fdt_setprop(blob, node, "bootargs", new_prop, strlen(new_prop) + 1); return 0; }