summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2021-05-03 13:48:51 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2021-05-12 07:59:59 +0200
commitff40047b3b6300015a8cc2c6a3e0989676250dbd (patch)
tree3d72f5c86f9be264098d1fcf2452abd8e7369a35 /common
parent15e26bb72b334da1830c26917e28ffcac64e8e4c (diff)
downloadbarebox-ff40047b3b6300015a8cc2c6a3e0989676250dbd.tar.gz
barebox-ff40047b3b6300015a8cc2c6a3e0989676250dbd.tar.xz
common: add generic system partitions interface
Both Fastboot and DFU have their own global variables that allow specifying the partitions that can be flashed via the environment. With the upcoming addition of the USB mass storage gadget, we will need some way to define the partitions there as well. Instead of adding yet another way download method-specific variable, add a generic global.system.partitions variable that can be specified on a per-board basis and can be used for all methods. Existing variables will still remain for backwards-compatibility, but when unset, it should fall back to this new parameter. This is done in the follow-up patches. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20210503114901.13095-7-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common')
-rw-r--r--common/Kconfig11
-rw-r--r--common/Makefile1
-rw-r--r--common/file-list.c18
-rw-r--r--common/system-partitions.c44
4 files changed, 74 insertions, 0 deletions
diff --git a/common/Kconfig b/common/Kconfig
index bf8054028b..5eb74cabd0 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -703,6 +703,17 @@ config FLEXIBLE_BOOTARGS
config BAREBOX_UPDATE
bool "In-system barebox update infrastructure"
+config SYSTEM_PARTITIONS
+ bool "Generic system partitions support"
+ depends on GLOBALVAR
+ help
+ System partitions are a generic way for boards to specify the
+ partitions that should be exported for flashing.
+ Board drivers that set this directly will select this option
+ automatically.
+ Say y here if this should be configurable over the
+ global.system.partitions device parameter as well.
+
config IMD
select CRC32
bool "barebox metadata support"
diff --git a/common/Makefile b/common/Makefile
index 17e2ff1129..c2c15817ba 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -17,6 +17,7 @@ obj-$(CONFIG_MACHINE_ID) += machine_id.o
obj-$(CONFIG_AUTO_COMPLETE) += complete.o
obj-y += version.o
obj-$(CONFIG_BAREBOX_UPDATE) += bbu.o
+obj-$(CONFIG_SYSTEM_PARTITIONS) += system-partitions.o
obj-$(CONFIG_BINFMT) += binfmt.o
obj-$(CONFIG_BLOCK) += block.o
obj-$(CONFIG_BLSPEC) += blspec.o
diff --git a/common/file-list.c b/common/file-list.c
index 924903cef7..580423aef7 100644
--- a/common/file-list.c
+++ b/common/file-list.c
@@ -170,6 +170,24 @@ void file_list_free(struct file_list *files)
free(files);
}
+struct file_list *file_list_dup(struct file_list *old)
+{
+ struct file_list_entry *old_entry;
+ struct file_list *new;
+
+ new = xzalloc(sizeof(*new));
+
+ INIT_LIST_HEAD(&new->list);
+
+ list_for_each_entry(old_entry, &old->list, list) {
+ (void)file_list_add_entry(new, old_entry->name, old_entry->filename,
+ old_entry->flags); /* can't fail */
+ new->num_entries++;
+ }
+
+ return new;
+}
+
char *file_list_to_str(const struct file_list *files)
{
struct file_list_entry *entry;
diff --git a/common/system-partitions.c b/common/system-partitions.c
new file mode 100644
index 0000000000..547e08a9f3
--- /dev/null
+++ b/common/system-partitions.c
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2021 Ahmad Fatoum, Pengutronix
+ */
+
+#include <file-list.h>
+#include <param.h>
+#include <globalvar.h>
+#include <init.h>
+#include <magicvar.h>
+#include <system-partitions.h>
+
+static struct file_list *system_partitions;
+
+bool system_partitions_empty(void)
+{
+ return file_list_empty(system_partitions);
+}
+
+struct file_list *system_partitions_get(void)
+{
+ return file_list_dup(system_partitions);
+}
+
+void system_partitions_set(struct file_list *files)
+{
+ file_list_free(system_partitions);
+ system_partitions = files;
+}
+
+static int system_partitions_var_init(void)
+{
+ struct param_d *param;
+
+ system_partitions = file_list_parse("");
+ param = dev_add_param_file_list(&global_device, "system.partitions",
+ NULL, NULL, &system_partitions, NULL);
+
+ return PTR_ERR_OR_ZERO(param);
+}
+postcore_initcall(system_partitions_var_init);
+
+BAREBOX_MAGICVAR(global.system.partitions,
+ "board-specific list of updatable partitions");