diff --git a/src/barebox-state.c b/src/barebox-state.c index e68b8cb..3622e76 100644 --- a/src/barebox-state.c +++ b/src/barebox-state.c @@ -308,7 +308,7 @@ } -struct state *state_get(const char *name, bool readonly, bool auth) +struct state *state_get(const char *name, const char *filename, bool readonly, bool auth) { struct device_node *root, *node, *partition_node; char *path; @@ -320,11 +320,19 @@ off_t offset; size_t size; - root = of_read_proc_devicetree(); - if (IS_ERR(root)) { - pr_err("Unable to read devicetree. %s\n", - strerror(-PTR_ERR(root))); - return ERR_CAST(root); + if (filename) { + void *fdt; + + fdt = read_file(filename, NULL); + if (fdt) + root = of_unflatten_dtb(fdt); + } else { + root = of_read_proc_devicetree(); + if (IS_ERR(root)) { + pr_err("Unable to read devicetree. %s\n", + strerror(-PTR_ERR(root))); + return ERR_CAST(root); + } } of_set_root_node(root); @@ -387,6 +395,7 @@ {"get", required_argument, 0, 'g' }, {"set", required_argument, 0, 's' }, {"name", required_argument, 0, 'n' }, + {"input", required_argument, 0, 'i' }, {"dump", no_argument, 0, 'd' }, {"dump-shell", no_argument, 0, OPT_DUMP_SHELL }, {"verbose", no_argument, 0, 'v' }, @@ -402,6 +411,7 @@ "-g, --get get the value of a variable\n" "-s, --set = set the value of a variable\n" "-n, --name specify the state to use (default=\"state\"). Multiple states are allowed.\n" +"-i, --input load the devicetree from a file instead of using the system devicetree.\n" "-d, --dump dump the state\n" "--dump-shell dump the state suitable for shell sourcing\n" "-v, --verbose increase verbosity\n" @@ -439,12 +449,13 @@ bool readonly = true; int pr_level = 5; int auth = 1; + const char *dtb = NULL; INIT_LIST_HEAD(&sg_list); INIT_LIST_HEAD(&state_list.list); while (1) { - c = getopt_long(argc, argv, "hg:s:dvn:qf", long_options, &option_index); + c = getopt_long(argc, argv, "hg:s:i:dvn:qf", long_options, &option_index); if (c < 0) break; switch (c) { @@ -490,6 +501,9 @@ ++nr_states; break; } + case 'i': + dtb = strdup(optarg); + break; case ':': case '?': default: @@ -530,7 +544,7 @@ } list_for_each_entry(state, &state_list.list, list) { - state->state = state_get(state->name, readonly, auth); + state->state = state_get(state->name, dtb, readonly, auth); if (!IS_ERR(state->state) && !state->name) state->name = state->state->name; if (IS_ERR(state->state)) { diff --git a/src/barebox-state.h b/src/barebox-state.h index bd89cf4..a0f49a5 100644 --- a/src/barebox-state.h +++ b/src/barebox-state.h @@ -1,7 +1,7 @@ #ifndef __BAREBOX_STATE__ #define __BAREBOX_STATE__ -struct state *state_get(const char *name, bool readonly, bool auth); +struct state *state_get(const char *name, const char *file, bool readonly, bool auth); char *state_get_var(struct state *state, const char *var); #endif /* __BAREBOX_STATE__ */ diff --git a/src/keystore-blob.c b/src/keystore-blob.c index 028dd8b..4572431 100644 --- a/src/keystore-blob.c +++ b/src/keystore-blob.c @@ -30,7 +30,7 @@ if (!state) { struct state *tmp; - tmp = state_get(keystore_state_name, true, false); + tmp = state_get(keystore_state_name, NULL, true, false); if (IS_ERR(tmp)) return PTR_ERR(tmp); state = tmp; diff --git a/src/libdt.c b/src/libdt.c index 3adeed2..2bc6cc1 100644 --- a/src/libdt.c +++ b/src/libdt.c @@ -2393,6 +2393,18 @@ */ node = partition_node->parent; + if (of_device_is_compatible(node, "fixed-partitions")) { + const char *uuid; + + /* when partuuid is specified short-circuit the search for the cdev */ + ret = of_property_read_string(partition_node, "partuuid", &uuid); + if (!ret) { + *devpath = basprintf("/dev/disk/by-partuuid/%s", uuid); + + return 0; + } + } + /* * Respect flash "partitions" subnode. Use parent of parent in this * case.