summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dtc-parser.y3
-rw-r--r--dtc.h2
-rw-r--r--fstree.c2
-rw-r--r--livetree.c23
-rw-r--r--tests/boot-cpuid.dts16
-rwxr-xr-xtests/run_tests.sh26
6 files changed, 64 insertions, 8 deletions
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 \