summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2021-06-24 10:52:12 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2021-06-25 09:27:07 +0200
commit8a7dec93f98a26e944dcfffcc6a320922d5afa2f (patch)
tree112813a46193ead8d367f9db4940b3119ece7293 /common
parentc59a74452296765e4d4806b0e6b7ba3b7957e283 (diff)
downloadbarebox-8a7dec93f98a26e944dcfffcc6a320922d5afa2f.tar.gz
barebox-8a7dec93f98a26e944dcfffcc6a320922d5afa2f.tar.xz
firmware: Add search path
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> Link: https://lore.barebox.org/20210624085223.14616-8-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common')
-rw-r--r--common/firmware.c41
1 files changed, 41 insertions, 0 deletions
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");