mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: Barebox List <barebox@lists.infradead.org>
Subject: [PATCH 05/17] firmware: Add search path
Date: Wed, 23 Jun 2021 07:16:20 +0200	[thread overview]
Message-ID: <20210623051632.30253-6-s.hauer@pengutronix.de> (raw)
In-Reply-To: <20210623051632.30253-1-s.hauer@pengutronix.de>

This adds a colon separated search path for firmware files. When the
firmware we are searching is not an absolute path then look in the
search path first. This will be useful later when the bootloader spec
implementation shall look for firmware files relative to the provided
root.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 common/firmware.c  | 41 +++++++++++++++++++++++++++++++++++++++++
 include/firmware.h | 12 ++++++++++++
 2 files changed, 53 insertions(+)

diff --git a/common/firmware.c b/common/firmware.c
index fa4f585693..477dc1f13a 100644
--- a/common/firmware.c
+++ b/common/firmware.c
@@ -11,6 +11,8 @@
 #include <libbb.h>
 #include <libfile.h>
 #include <fs.h>
+#include <globalvar.h>
+#include <magicvar.h>
 #include <linux/list.h>
 #include <linux/stat.h>
 #include <linux/err.h>
@@ -208,6 +210,26 @@ out:
 	return ret;
 }
 
+static char *firmware_path;
+
+const char *firmware_get_searchpath(void)
+{
+	return firmware_path;
+}
+
+void firmware_set_searchpath(const char *path)
+{
+	free(firmware_path);
+	firmware_path = strdup(path);
+}
+
+static bool file_exists(const char *filename)
+{
+	struct stat s;
+
+	return !stat(filename, &s);
+}
+
 /*
  * firmware_load_file - load a firmware to a device
  */
@@ -216,6 +238,7 @@ int firmwaremgr_load_file(struct firmware_mgr *mgr, const char *firmware)
 	char *dst;
 	enum filetype type;
 	int ret = 0;
+	char *fw = NULL;
 	int firmwarefd = 0;
 	int devicefd = 0;
 
@@ -229,6 +252,12 @@ int firmwaremgr_load_file(struct firmware_mgr *mgr, const char *firmware)
 
 	dst = basprintf("/dev/%s", mgr->handler->id);
 
+	if (*firmware != '/') {
+		fw = find_path(firmware_path, firmware, file_exists);
+		if (fw)
+			firmware = fw;
+	}
+
 	firmwarefd = open(firmware, O_RDONLY);
 	if (firmwarefd < 0) {
 		printf("could not open %s: %s\n", firmware,
@@ -254,6 +283,7 @@ int firmwaremgr_load_file(struct firmware_mgr *mgr, const char *firmware)
 
 out:
 	free(dst);
+	free(fw);
 
 	if (firmwarefd > 0)
 		close(firmwarefd);
@@ -262,3 +292,14 @@ out:
 
 	return ret;
 }
+
+static int firmware_init(void)
+{
+	firmware_path = strdup("/env/firmware");
+	globalvar_add_simple_string("firmware.path", &firmware_path);
+
+	return 0;
+}
+device_initcall(firmware_init);
+
+BAREBOX_MAGICVAR(global.firmware.path, "Firmware search path");
diff --git a/include/firmware.h b/include/firmware.h
index 39e84b9ac7..515bdcaf40 100644
--- a/include/firmware.h
+++ b/include/firmware.h
@@ -30,6 +30,8 @@ struct firmware_mgr *firmwaremgr_find(const char *);
 #ifdef CONFIG_FIRMWARE
 struct firmware_mgr *firmwaremgr_find_by_node(struct device_node *np);
 int firmwaremgr_load_file(struct firmware_mgr *, const char *path);
+const char *firmware_get_searchpath(void);
+void firmware_set_searchpath(const char *path);
 #else
 static inline struct firmware_mgr *firmwaremgr_find_by_node(struct device_node *np)
 {
@@ -40,6 +42,16 @@ static inline int firmwaremgr_load_file(struct firmware_mgr *mgr, const char *pa
 {
 	return -ENOSYS;
 }
+
+static inline const char *firmware_get_searchpath(void)
+{
+	return NULL;
+}
+
+static inline void firmware_set_searchpath(const char *path)
+{
+}
+
 #endif
 
 void firmwaremgr_list_handlers(void);
-- 
2.29.2


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


  parent reply	other threads:[~2021-06-23  5:19 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-23  5:16 [PATCH v2 00/17] Apply device tree overlays to kernel tree Sascha Hauer
2021-06-23  5:16 ` [PATCH 01/17] fdt: Check blob size during unflattening Sascha Hauer
2021-06-23  5:16 ` [PATCH 02/17] firmware: make device_node argument non const Sascha Hauer
2021-06-23  5:16 ` [PATCH 03/17] libbb: Add find_path function Sascha Hauer
2021-06-23  5:16 ` [PATCH 04/17] firmware: consolidate ifdefs Sascha Hauer
2021-06-23  5:16 ` Sascha Hauer [this message]
2021-06-23  5:16 ` [PATCH 06/17] firmware: Fix device_node matching Sascha Hauer
2021-06-23  5:16 ` [PATCH 07/17] firmware: recognize by reproducible name Sascha Hauer
2021-06-23  5:16 ` [PATCH 08/17] blspec: Set firmware searchpath Sascha Hauer
2021-06-23  5:16 ` [PATCH 09/17] overlay: only apply compatible trees Sascha Hauer
2021-06-23  5:16 ` [PATCH 10/17] overlay: Add of_overlay_apply_file() Sascha Hauer
2021-06-23  5:16 ` [PATCH 11/17] firmware: Load from global search path Sascha Hauer
2021-06-23  5:16 ` [PATCH 12/17] blspec: Rework firmware load Sascha Hauer
2021-06-23  5:16 ` [PATCH 13/17] of_overlay: apply overlays during booting Sascha Hauer
2021-06-23  5:16 ` [PATCH 14/17] blspec: Apply overlays from rootfs Sascha Hauer
2021-06-23  5:16 ` [PATCH 15/17] doc: devicetree: Refer to internal device tree also as live tree Sascha Hauer
2021-06-23  5:16 ` [PATCH 16/17] Documentation: Add documentation for device tree overlays Sascha Hauer
2021-06-23  6:13   ` Ahmad Fatoum
2021-06-23 19:37     ` Trent Piepho
2021-06-24  8:48       ` Sascha Hauer
2021-06-23  5:16 ` [PATCH 17/17] of_firmware: Fix handling of firmware-name property Sascha Hauer
  -- strict thread matches above, loose matches on Subject: below --
2021-03-10 13:28 [PATCH 00/17] Apply device tree overlays to kernel tree Sascha Hauer
2021-03-10 13:28 ` [PATCH 05/17] firmware: Add search path Sascha Hauer

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=20210623051632.30253-6-s.hauer@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    /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