mailarchive of the pengutronix oss-tools mailing list
 help / color / mirror / Atom feed
From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: oss-tools@pengutronix.de
Cc: Steffen Trumtrar <s.trumtrar@pengutronix.de>
Subject: [OSS-Tools] [PATCH v5 2/2] barebox-state: get devicetree from file
Date: Thu, 24 Oct 2019 16:24:51 +0200	[thread overview]
Message-ID: <20191024142451.15777-3-a.fatoum@pengutronix.de> (raw)
In-Reply-To: <20191024142451.15777-1-a.fatoum@pengutronix.de>

From: Steffen Trumtrar <s.trumtrar@pengutronix.de>

Adds a -i/--input argument to barebox-state to allow passing a
devicetree as a file instead of using it from the system.
This can be used for example on systems that do not use device trees
(such as x86) but where we want to use a dtb blob for describing the
state storage and format.

Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
Signed-off-by: Enrico Jorns <ejo@pengutronix.de>
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 src/barebox-state.c | 41 +++++++++++++++++++++++++++++++++--------
 src/barebox-state.h |  2 +-
 src/keystore-blob.c |  2 +-
 3 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/src/barebox-state.c b/src/barebox-state.c
index 946a8dba6d8c..c7f6dee90d4a 100644
--- a/src/barebox-state.c
+++ b/src/barebox-state.c
@@ -306,17 +306,36 @@ static int state_set_var(struct state *state, const char *var, const char *val)
 }
 
 
-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;
 	struct state *state;
 	int ret;
 
-	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) {
+			pr_err("Unable to read devicetree file '%s'\n",
+			       filename);
+			return ERR_PTR(-ENOENT);
+		}
+
+		root = of_unflatten_dtb(fdt);
+		free(fdt);
+		if (IS_ERR(root)) {
+			pr_err("Unable to read devicetree. %s\n",
+			       strerror(-PTR_ERR(root)));
+			return ERR_CAST(root);
+		}
+	} 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);
@@ -368,6 +387,7 @@ static struct option long_options[] = {
 	{"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 },
 	{"force",	no_argument,		0,	'f' },
@@ -386,6 +406,7 @@ static void usage(char *name)
 "-g, --get <variable>                      get the value of a variable\n"
 "-s, --set <variable>=<value>              set the value of a variable\n"
 "-n, --name <name>                         specify the state to use (default=\"state\"). Multiple states are allowed.\n"
+"-i, --input <name>                        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"
 "-f, --force                               do not check for state manipulation via the HMAC\n"
@@ -425,12 +446,13 @@ int main(int argc, char *argv[])
 	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) {
@@ -479,6 +501,9 @@ int main(int argc, char *argv[])
 			++nr_states;
 			break;
 		}
+		case 'i':
+			dtb = optarg;
+			break;
 		case ':':
 		case '?':
 		default:
@@ -519,7 +544,7 @@ int main(int argc, char *argv[])
 	}
 
 	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 bd89cf48c6a3..a0f49a549649 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 f71ff5d9d5cb..ed6ecb4eaa25 100644
--- a/src/keystore-blob.c
+++ b/src/keystore-blob.c
@@ -30,7 +30,7 @@ int keystore_get_secret(const char *name, const unsigned char **key, int *key_le
 	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;
-- 
2.23.0


_______________________________________________
OSS-Tools mailing list
OSS-Tools@pengutronix.de

  parent reply	other threads:[~2019-10-24 14:24 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-24 14:24 [OSS-Tools] [PATCH dt-utils v5 0/2] " Ahmad Fatoum
2019-10-24 14:24 ` [OSS-Tools] [PATCH v5 1/2] libdt: support upper-case hexadecimals in value of partuuid property Ahmad Fatoum
2019-10-24 14:24 ` Ahmad Fatoum [this message]
2020-07-09 13:20 ` [OSS-Tools] [PATCH dt-utils v5 0/2] barebox-state: get devicetree from file Ahmad Fatoum
2020-07-09 13:37   ` Roland Hieber
2021-03-16 14:18 ` Roland Hieber

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191024142451.15777-3-a.fatoum@pengutronix.de \
    --to=a.fatoum@pengutronix.de \
    --cc=oss-tools@pengutronix.de \
    --cc=s.trumtrar@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox