diff --git a/dtc-parser.y b/dtc-parser.y index a2c0925..bd9e097 100644 --- a/dtc-parser.y +++ b/dtc-parser.y @@ -85,7 +85,8 @@ static unsigned long long eval_literal(const char *s, int base, int bits); sourcefile: DT_V1 ';' memreserves devicetree { - the_boot_info = build_boot_info($3, $4, 0); + the_boot_info = build_boot_info($3, $4, + guess_boot_cpuid($4)); } ; diff --git a/dtc.h b/dtc.h index a85e5b7..13136e4 100644 --- a/dtc.h +++ b/dtc.h @@ -178,6 +178,8 @@ struct node *get_node_by_phandle(struct node *tree, cell_t phandle); struct node *get_node_by_ref(struct node *tree, const char *ref); cell_t get_node_phandle(struct node *root, struct node *node); +uint32_t guess_boot_cpuid(struct node *tree); + /* Boot info (tree plus memreserve information */ struct reserve_info { diff --git a/fstree.c b/fstree.c index 7aee982..d43343a 100644 --- a/fstree.c +++ b/fstree.c @@ -87,6 +87,6 @@ struct boot_info *dt_from_fs(const char *dirname) tree = read_fstree(dirname); tree = name_node(tree, "", NULL); - return build_boot_info(NULL, tree, 0); + return build_boot_info(NULL, tree, guess_boot_cpuid(tree)); } diff --git a/livetree.c b/livetree.c index 9a482a8..0230949 100644 --- a/livetree.c +++ b/livetree.c @@ -318,3 +318,26 @@ cell_t get_node_phandle(struct node *root, struct node *node) return node->phandle; } + +uint32_t guess_boot_cpuid(struct node *tree) +{ + struct node *cpus, *bootcpu; + struct property *reg; + + cpus = get_node_by_path(tree, "/cpus"); + if (!cpus) + return 0; + + + bootcpu = cpus->children; + if (!bootcpu) + return 0; + + reg = get_property(bootcpu, "reg"); + if (!reg || (reg->val.len != sizeof(uint32_t))) + return 0; + + /* FIXME: Sanity check node? */ + + return propval_cell(reg); +} diff --git a/tests/boot-cpuid.dts b/tests/boot-cpuid.dts new file mode 100644 index 0000000..7021a24 --- /dev/null +++ b/tests/boot-cpuid.dts @@ -0,0 +1,16 @@ +/dts-v1/; + +/ { + cpus { + cpu@10 { + device_type = "cpu"; + compatible = "fake-cpu"; + reg = <0x10>; + }; + cpu@11 { + device_type = "cpu"; + compatible = "fake-cpu"; + reg = <0x11>; + }; + }; +}; diff --git a/tests/run_tests.sh b/tests/run_tests.sh index c532030..ca46051 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -242,12 +242,26 @@ dtc_tests () { run_test incbin incbin.test.dtb # Check boot_cpuid_phys handling - run_dtc_test -I dts -O dtb -b 17 -o boot_cpuid.test.dtb empty.dts - run_test boot-cpuid boot_cpuid.test.dtb 17 - run_dtc_test -I dtb -O dtb -b 17 -o boot_cpuid_test_tree1.test.dtb test_tree1.dtb - run_test boot-cpuid boot_cpuid_test_tree1.test.dtb 17 - run_dtc_test -I dtb -O dtb -o boot_cpuid_preserved_test_tree1.test.dtb boot_cpuid_test_tree1.test.dtb - run_test dtbs_equal_ordered boot_cpuid_preserved_test_tree1.test.dtb boot_cpuid_test_tree1.test.dtb + run_dtc_test -I dts -O dtb -o boot_cpuid.test.dtb boot-cpuid.dts + run_test boot-cpuid boot_cpuid.test.dtb 16 + + run_dtc_test -I dts -O dtb -b 17 -o boot_cpuid_17.test.dtb boot-cpuid.dts + run_test boot-cpuid boot_cpuid_17.test.dtb 17 + + run_dtc_test -I dtb -O dtb -o preserve_boot_cpuid.test.dtb boot_cpuid.test.dtb + run_test boot-cpuid preserve_boot_cpuid.test.dtb 16 + run_test dtbs_equal_ordered preserve_boot_cpuid.test.dtb boot_cpuid.test.dtb + + run_dtc_test -I dtb -O dtb -o preserve_boot_cpuid_17.test.dtb boot_cpuid_17.test.dtb + run_test boot-cpuid preserve_boot_cpuid_17.test.dtb 17 + run_test dtbs_equal_ordered preserve_boot_cpuid_17.test.dtb boot_cpuid_17.test.dtb + + run_dtc_test -I dtb -O dtb -b17 -o override17_boot_cpuid.test.dtb boot_cpuid.test.dtb + run_test boot-cpuid override17_boot_cpuid.test.dtb 17 + + run_dtc_test -I dtb -O dtb -b0 -o override0_boot_cpuid_17.test.dtb boot_cpuid_17.test.dtb + run_test boot-cpuid override0_boot_cpuid_17.test.dtb 0 + # Check -Oasm mode for tree in test_tree1.dts escapes.dts references.dts path-references.dts \