Browse Source

dtc: add setting of physical boot cpu

dtc always sets the physical boot CPU to 0xfeedbeef.  Add a -b option to
set this.    Also add warnings when using the wrong property with the
wrong blob version.

Signed-off-by: Michael Neuling <mikey@neuling.org>
main
Michael Neuling 19 years ago committed by Jon Loeliger
parent
commit
38e8f8fd88
  1. 14
      dtc.c
  2. 8
      dtc.h
  3. 16
      flattree.c
  4. 17
      livetree.c

14
dtc.c

@ -95,6 +95,8 @@ static void usage(void)
fprintf(stderr, "\t\tBlob version to produce, defaults to 3 (relevant for dtb\n\t\tand asm output only)\n"); fprintf(stderr, "\t\tBlob version to produce, defaults to 3 (relevant for dtb\n\t\tand asm output only)\n");
fprintf(stderr, "\t-R <number>\n"); fprintf(stderr, "\t-R <number>\n");
fprintf(stderr, "\t\tMake space for <number> reserve map entries (relevant for \n\t\tdtb and asm output only)\n"); fprintf(stderr, "\t\tMake space for <number> reserve map entries (relevant for \n\t\tdtb and asm output only)\n");
fprintf(stderr, "\t-b <number>\n");
fprintf(stderr, "\t\tSet the physical boot cpu\n");
fprintf(stderr, "\t-f\n"); fprintf(stderr, "\t-f\n");
fprintf(stderr, "\t\tForce - try to produce output even if the input tree has errors\n"); fprintf(stderr, "\t\tForce - try to produce output even if the input tree has errors\n");
exit(2); exit(2);
@ -113,8 +115,9 @@ int main(int argc, char *argv[])
FILE *outf = NULL; FILE *outf = NULL;
int outversion = 3; int outversion = 3;
int reservenum = 1; int reservenum = 1;
int boot_cpuid_phys = 0xfeedbeef;


while ((opt = getopt(argc, argv, "I:O:o:V:R:f")) != EOF) { while ((opt = getopt(argc, argv, "I:O:o:V:R:fb:")) != EOF) {
switch (opt) { switch (opt) {
case 'I': case 'I':
inform = optarg; inform = optarg;
@ -134,6 +137,9 @@ int main(int argc, char *argv[])
case 'f': case 'f':
force = 1; force = 1;
break; break;
case 'b':
boot_cpuid_phys = strtol(optarg, NULL, 0);
break;
default: default:
usage(); usage();
} }
@ -167,7 +173,7 @@ int main(int argc, char *argv[])
if (! bi || ! bi->dt) if (! bi || ! bi->dt)
die("Couldn't read input tree\n"); die("Couldn't read input tree\n");


if (! check_device_tree(bi->dt)) { if (! check_device_tree(bi->dt, outversion, boot_cpuid_phys)) {
fprintf(stderr, "Input tree has errors\n"); fprintf(stderr, "Input tree has errors\n");
if (! force) if (! force)
exit(1); exit(1);
@ -185,9 +191,9 @@ int main(int argc, char *argv[])
if (streq(outform, "dts")) { if (streq(outform, "dts")) {
dt_to_source(outf, bi); dt_to_source(outf, bi);
} else if (streq(outform, "dtb")) { } else if (streq(outform, "dtb")) {
dt_to_blob(outf, bi, outversion); dt_to_blob(outf, bi, outversion, boot_cpuid_phys);
} else if (streq(outform, "asm")) { } else if (streq(outform, "asm")) {
dt_to_asm(outf, bi, outversion); dt_to_asm(outf, bi, outversion, boot_cpuid_phys);
} else if (streq(outform, "null")) { } else if (streq(outform, "null")) {
/* do nothing */ /* do nothing */
} else { } else {

8
dtc.h

@ -178,7 +178,7 @@ struct node *chain_node(struct node *first, struct node *list);
void add_property(struct node *node, struct property *prop); void add_property(struct node *node, struct property *prop);
void add_child(struct node *parent, struct node *child); void add_child(struct node *parent, struct node *child);


int check_device_tree(struct node *dt); int check_device_tree(struct node *dt, int outversion, int boot_cpuid_phys);


/* Boot info (tree plus memreserve information */ /* Boot info (tree plus memreserve information */


@ -207,8 +207,10 @@ struct boot_info *build_boot_info(struct reserve_info *reservelist,


/* Flattened trees */ /* Flattened trees */


void dt_to_blob(FILE *f, struct boot_info *bi, int version); void dt_to_blob(FILE *f, struct boot_info *bi, int version,
void dt_to_asm(FILE *f, struct boot_info *bi, int version); int boot_cpuid_phys);
void dt_to_asm(FILE *f, struct boot_info *bi, int version,
int boot_cpuid_phys);


struct boot_info *dt_from_blob(FILE *f); struct boot_info *dt_from_blob(FILE *f);



16
flattree.c

@ -301,7 +301,8 @@ static struct data flatten_reserve_list(struct reserve_info *reservelist,
} }
static void make_bph(struct boot_param_header *bph, static void make_bph(struct boot_param_header *bph,
struct version_info *vi, struct version_info *vi,
int reservesize, int dtsize, int strsize) int reservesize, int dtsize, int strsize,
int boot_cpuid_phys)
{ {
int reserve_off; int reserve_off;


@ -324,12 +325,13 @@ static void make_bph(struct boot_param_header *bph,
+ dtsize + strsize); + dtsize + strsize);
if (vi->flags & FTF_BOOTCPUID) if (vi->flags & FTF_BOOTCPUID)
bph->boot_cpuid_phys = 0xfeedbeef; bph->boot_cpuid_phys = cpu_to_be32(boot_cpuid_phys);
if (vi->flags & FTF_STRTABSIZE) if (vi->flags & FTF_STRTABSIZE)
bph->size_dt_strings = cpu_to_be32(strsize); bph->size_dt_strings = cpu_to_be32(strsize);
} }


void dt_to_blob(FILE *f, struct boot_info *bi, int version) void dt_to_blob(FILE *f, struct boot_info *bi, int version,
int boot_cpuid_phys)
{ {
struct version_info *vi = NULL; struct version_info *vi = NULL;
int i; int i;
@ -355,7 +357,8 @@ void dt_to_blob(FILE *f, struct boot_info *bi, int version)
reservebuf = flatten_reserve_list(bi->reservelist, vi); reservebuf = flatten_reserve_list(bi->reservelist, vi);


/* Make header */ /* Make header */
make_bph(&bph, vi, reservebuf.len, dtbuf.len, strbuf.len); make_bph(&bph, vi, reservebuf.len, dtbuf.len, strbuf.len,
boot_cpuid_phys);


fwrite(&bph, vi->hdr_size, 1, f); fwrite(&bph, vi->hdr_size, 1, f);


@ -395,7 +398,7 @@ static void dump_stringtable_asm(FILE *f, struct data strbuf)
} }
} }


void dt_to_asm(FILE *f, struct boot_info *bi, int version) void dt_to_asm(FILE *f, struct boot_info *bi, int version, int boot_cpuid_phys)
{ {
struct version_info *vi = NULL; struct version_info *vi = NULL;
int i; int i;
@ -434,7 +437,8 @@ void dt_to_asm(FILE *f, struct boot_info *bi, int version)
vi->last_comp_version); vi->last_comp_version);


if (vi->flags & FTF_BOOTCPUID) if (vi->flags & FTF_BOOTCPUID)
fprintf(f, "\t.long\t0xdeadbeef\t/*boot_cpuid_phys*/\n"); fprintf(f, "\t.long\t%i\t/*boot_cpuid_phys*/\n",
boot_cpuid_phys);


if (vi->flags & FTF_STRTABSIZE) if (vi->flags & FTF_STRTABSIZE)
fprintf(f, "\t.long\t_%s_strings_end - _%s_strings_start\t/* size_dt_strings */\n", fprintf(f, "\t.long\t_%s_strings_end - _%s_strings_start\t/* size_dt_strings */\n",

17
livetree.c

@ -456,7 +456,7 @@ static int check_root(struct node *root)
return ok; return ok;
} }


static int check_cpus(struct node *root) static int check_cpus(struct node *root, int outversion, int boot_cpuid_phys)
{ {
struct node *cpus, *cpu; struct node *cpus, *cpu;
struct property *prop; struct property *prop;
@ -518,8 +518,15 @@ static int check_cpus(struct node *root)
} }
} }


if (! bootcpu) if (outversion < 2) {
WARNMSG("No cpu has \"linux,boot-cpu\" property\n"); if (! bootcpu)
WARNMSG("No cpu has \"linux,boot-cpu\" property\n");
} else {
if (bootcpu)
WARNMSG("\"linux,boot-cpu\" property is deprecated in blob version 2 or higher\n");
if (boot_cpuid_phys == 0xfeedbeef)
WARNMSG("physical boot CPU not set. Use -b option to set\n");
}


return ok; return ok;
} }
@ -697,7 +704,7 @@ static void fixup_phandles(struct node *root, struct node *node)
fixup_phandles(root, child); fixup_phandles(root, child);
} }


int check_device_tree(struct node *dt) int check_device_tree(struct node *dt, int outversion, int boot_cpuid_phys)
{ {
int ok = 1; int ok = 1;


@ -713,7 +720,7 @@ int check_device_tree(struct node *dt)
return 0; return 0;


ok = ok && check_root(dt); ok = ok && check_root(dt);
ok = ok && check_cpus(dt); ok = ok && check_cpus(dt, outversion, boot_cpuid_phys);
ok = ok && check_memory(dt); ok = ok && check_memory(dt);
ok = ok && check_chosen(dt); ok = ok && check_chosen(dt);
if (! ok) if (! ok)

Loading…
Cancel
Save