mirror of https://github.com/OpenIPC/firmware.git
134 lines
3.9 KiB
Diff
134 lines
3.9 KiB
Diff
diff -drupN a/scripts/dtc/flattree.c b/scripts/dtc/flattree.c
|
|
--- a/scripts/dtc/flattree.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/scripts/dtc/flattree.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -184,7 +184,7 @@ static void asm_emit_data(void *e, struc
|
|
}
|
|
|
|
while ((d.len - off) >= 1) {
|
|
- fprintf(f, "\t.byte\t0x%hhx\n", d.val[off]);
|
|
+ fprintf(f, "\t.byte\t0x%hhx\n", (unsigned char)d.val[off]);
|
|
off += 1;
|
|
}
|
|
|
|
@@ -366,7 +366,7 @@ static void make_fdt_header(struct fdt_h
|
|
fdt->size_dt_struct = cpu_to_fdt32(dtsize);
|
|
}
|
|
|
|
-void dt_to_blob(FILE *f, struct boot_info *bi, int version)
|
|
+void dt_to_blob(FILE *f, struct dt_info *dti, int version)
|
|
{
|
|
struct version_info *vi = NULL;
|
|
int i;
|
|
@@ -384,29 +384,36 @@ void dt_to_blob(FILE *f, struct boot_inf
|
|
if (!vi)
|
|
die("Unknown device tree blob version %d\n", version);
|
|
|
|
- flatten_tree(bi->dt, &bin_emitter, &dtbuf, &strbuf, vi);
|
|
+ flatten_tree(dti->dt, &bin_emitter, &dtbuf, &strbuf, vi);
|
|
bin_emit_cell(&dtbuf, FDT_END);
|
|
|
|
- reservebuf = flatten_reserve_list(bi->reservelist, vi);
|
|
+ reservebuf = flatten_reserve_list(dti->reservelist, vi);
|
|
|
|
/* Make header */
|
|
make_fdt_header(&fdt, vi, reservebuf.len, dtbuf.len, strbuf.len,
|
|
- bi->boot_cpuid_phys);
|
|
+ dti->boot_cpuid_phys);
|
|
|
|
/*
|
|
* If the user asked for more space than is used, adjust the totalsize.
|
|
*/
|
|
if (minsize > 0) {
|
|
padlen = minsize - fdt32_to_cpu(fdt.totalsize);
|
|
- if ((padlen < 0) && (quiet < 1))
|
|
- fprintf(stderr,
|
|
- "Warning: blob size %d >= minimum size %d\n",
|
|
- fdt32_to_cpu(fdt.totalsize), minsize);
|
|
+ if (padlen < 0) {
|
|
+ padlen = 0;
|
|
+ if (quiet < 1)
|
|
+ fprintf(stderr,
|
|
+ "Warning: blob size %d >= minimum size %d\n",
|
|
+ fdt32_to_cpu(fdt.totalsize), minsize);
|
|
+ }
|
|
}
|
|
|
|
if (padsize > 0)
|
|
padlen = padsize;
|
|
|
|
+ if (alignsize > 0)
|
|
+ padlen = ALIGN(fdt32_to_cpu(fdt.totalsize) + padlen, alignsize)
|
|
+ - fdt32_to_cpu(fdt.totalsize);
|
|
+
|
|
if (padlen > 0) {
|
|
int tsize = fdt32_to_cpu(fdt.totalsize);
|
|
tsize += padlen;
|
|
@@ -460,7 +467,7 @@ static void dump_stringtable_asm(FILE *f
|
|
}
|
|
}
|
|
|
|
-void dt_to_asm(FILE *f, struct boot_info *bi, int version)
|
|
+void dt_to_asm(FILE *f, struct dt_info *dti, int version)
|
|
{
|
|
struct version_info *vi = NULL;
|
|
int i;
|
|
@@ -500,7 +507,7 @@ void dt_to_asm(FILE *f, struct boot_info
|
|
|
|
if (vi->flags & FTF_BOOTCPUID) {
|
|
fprintf(f, "\t/* boot_cpuid_phys */\n");
|
|
- asm_emit_cell(f, bi->boot_cpuid_phys);
|
|
+ asm_emit_cell(f, dti->boot_cpuid_phys);
|
|
}
|
|
|
|
if (vi->flags & FTF_STRTABSIZE) {
|
|
@@ -530,7 +537,7 @@ void dt_to_asm(FILE *f, struct boot_info
|
|
* Use .long on high and low halfs of u64s to avoid .quad
|
|
* as it appears .quad isn't available in some assemblers.
|
|
*/
|
|
- for (re = bi->reservelist; re; re = re->next) {
|
|
+ for (re = dti->reservelist; re; re = re->next) {
|
|
struct label *l;
|
|
|
|
for_each_label(re->labels, l) {
|
|
@@ -550,7 +557,7 @@ void dt_to_asm(FILE *f, struct boot_info
|
|
fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
|
|
|
|
emit_label(f, symprefix, "struct_start");
|
|
- flatten_tree(bi->dt, &asm_emitter, f, &strbuf, vi);
|
|
+ flatten_tree(dti->dt, &asm_emitter, f, &strbuf, vi);
|
|
|
|
fprintf(f, "\t/* FDT_END */\n");
|
|
asm_emit_cell(f, FDT_END);
|
|
@@ -572,6 +579,8 @@ void dt_to_asm(FILE *f, struct boot_info
|
|
if (padsize > 0) {
|
|
fprintf(f, "\t.space\t%d, 0\n", padsize);
|
|
}
|
|
+ if (alignsize > 0)
|
|
+ asm_emit_align(f, alignsize);
|
|
emit_label(f, symprefix, "blob_abs_end");
|
|
|
|
data_free(strbuf);
|
|
@@ -797,11 +806,14 @@ static struct node *unflatten_tree(struc
|
|
}
|
|
} while (val != FDT_END_NODE);
|
|
|
|
+ if (node->name != flatname)
|
|
+ free(flatname);
|
|
+
|
|
return node;
|
|
}
|
|
|
|
|
|
-struct boot_info *dt_from_blob(const char *fname)
|
|
+struct dt_info *dt_from_blob(const char *fname)
|
|
{
|
|
FILE *f;
|
|
uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys;
|
|
@@ -929,5 +941,5 @@ struct boot_info *dt_from_blob(const cha
|
|
|
|
fclose(f);
|
|
|
|
- return build_boot_info(reservelist, tree, boot_cpuid_phys);
|
|
+ return build_dt_info(DTSF_V1, reservelist, tree, boot_cpuid_phys);
|
|
}
|