mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH v2 00/15] USB: gadget: refactor to allow easier extension
@ 2021-04-30 13:29 Ahmad Fatoum
  2021-04-30 13:29 ` [PATCH v2 01/15] show_progress: add system wide progress stage notifier Ahmad Fatoum
                   ` (14 more replies)
  0 siblings, 15 replies; 19+ messages in thread
From: Ahmad Fatoum @ 2021-04-30 13:29 UTC (permalink / raw)
  To: barebox

There's some duplication between DFU and Fastboot and incoming USB
mass storage support as well as custom protocols that might be
implemented by board vendors could benefit from some consolidation.

This is added here in the form of system partitions, which is just
a way to have a machine-global file_list, that can be used as fallback
for fastboot, DFU, mass storage gadget, ... etc.

Some commits are not directly related and happened along the way.

Let me know if I should split up the series.

v1 -> v2:
 - log_writefile(filename) instead of log_dprint(fd) (Sascha)
 - rename $machine.partitions to $global.system.partitions (Sascha)
 - add new commit fixing error with appending to files on ext4 

Ahmad Fatoum (15):
  show_progress: add system wide progress stage notifier
  common: console: add log_writefile to write log into new file
  string: implement strstarts along with strends
  vsprintf: introduce %m shorthand for "%s", strerror(errno)
  param: introduce file-list parameter type
  common: add generic system partitions interface
  fastboot: handle ill-named partitions gracefully
  usb: gadget: dfu: change status message to info log level
  usbgadget: autostart: fix indeterminism around usbgadget.autostart
  usbgadget: allow DFU and Fastboot functions to coexist
  fastboot/dfu: use system partitions as fall back
  bbu: add function to directly add handlers into file_list
  file_list: add file_list_detect_all()
  common: make FILE_LIST feature unconditional
  fs: error out when writing on read-only file system

 common/Kconfig              | 15 +++++--
 common/Makefile             |  3 +-
 common/bbu.c                | 24 ++++++----
 common/console_common.c     | 20 +++++++++
 common/fastboot.c           | 28 ++++--------
 common/file-list.c          | 82 ++++++++++++++++++++++++++++++++++
 common/system-partitions.c  | 44 +++++++++++++++++++
 common/usbgadget.c          | 81 +++++++++++++++++++---------------
 drivers/usb/gadget/Kconfig  |  2 -
 drivers/usb/gadget/dfu.c    |  3 +-
 drivers/usb/gadget/multi.c  | 12 +++++
 fs/fs.c                     |  6 +--
 include/bbu.h               | 10 ++++-
 include/fastboot.h          |  6 +--
 include/file-list.h         | 12 +++++
 include/linux/string.h      | 10 +++++
 include/param.h             | 15 +++++++
 include/printk.h            |  1 +
 include/progress.h          | 43 ++++++++++++++++++
 include/string.h            |  1 +
 include/stringlist.h        |  1 +
 include/system-partitions.h | 40 +++++++++++++++++
 include/usb/gadget-multi.h  |  1 +
 lib/Kconfig                 |  6 +++
 lib/parameter.c             | 88 +++++++++++++++++++++++++++++++++++++
 lib/show_progress.c         | 28 ++++++++++++
 lib/string.c                |  9 ++++
 lib/stringlist.c            | 30 +++++++++++++
 lib/vsprintf.c              | 13 ++++++
 net/Kconfig                 |  1 -
 net/fastboot.c              |  4 +-
 31 files changed, 555 insertions(+), 84 deletions(-)
 create mode 100644 common/system-partitions.c
 create mode 100644 include/system-partitions.h

-- 
2.29.2


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


^ permalink raw reply	[flat|nested] 19+ messages in thread
* [PATCH 12/16] fastboot/dfu: use system partitions as fall back
@ 2021-05-03 11:48 Ahmad Fatoum
  2021-05-03 12:30 ` [PATCH] fixup! " Ahmad Fatoum
  0 siblings, 1 reply; 19+ messages in thread
From: Ahmad Fatoum @ 2021-05-03 11:48 UTC (permalink / raw)
  To: barebox; +Cc: Ahmad Fatoum

Use the new system partitions infrastructure to have fastboot and DFU
fall back to using the same partitions if the global.usbgadget.dfu_function
and global.fastboot_partitions are not set, respectively.

No functional change intended for configurations that have
SYSTEM_PARTITIONS disabled.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 common/fastboot.c          |  9 ++++-
 common/usbgadget.c         | 76 +++++++++++++++++++++++---------------
 drivers/usb/gadget/multi.c | 12 ++++++
 include/fastboot.h         |  6 +--
 include/file-list.h        |  5 +++
 include/usb/gadget-multi.h |  1 +
 net/fastboot.c             |  4 +-
 7 files changed, 75 insertions(+), 38 deletions(-)

diff --git a/common/fastboot.c b/common/fastboot.c
index c8576a8d97c3..dc80b66e6720 100644
--- a/common/fastboot.c
+++ b/common/fastboot.c
@@ -41,6 +41,7 @@
 #include <linux/stat.h>
 #include <linux/mtd/mtd.h>
 #include <fastboot.h>
+#include <system-partitions.h>
 
 #define FASTBOOT_VERSION		"0.4"
 
@@ -932,9 +933,13 @@ bool get_fastboot_bbu(void)
 	return fastboot_bbu;
 }
 
-const char *get_fastboot_partitions(void)
+struct file_list *get_fastboot_partitions(void)
 {
-	return fastboot_partitions;
+	if (fastboot_partitions && *fastboot_partitions)
+		return file_list_parse(fastboot_partitions);
+	if (!system_partitions_empty())
+		return system_partitions_get();
+	return NULL;
 }
 
 static int fastboot_globalvars_init(void)
diff --git a/common/usbgadget.c b/common/usbgadget.c
index 009debd93efc..b953f8bf771c 100644
--- a/common/usbgadget.c
+++ b/common/usbgadget.c
@@ -17,6 +17,7 @@
 #include <usb/gadget-multi.h>
 #include <globalvar.h>
 #include <magicvar.h>
+#include <system-partitions.h>
 
 static int autostart;
 static int acm;
@@ -24,14 +25,29 @@ static char *dfu_function;
 
 static struct file_list *parse(const char *files)
 {
-	struct file_list *list = file_list_parse(files);
+	struct file_list *list;
+
+	if (!files)
+		return NULL;
+
+	list = file_list_parse(files);
 	if (IS_ERR(list)) {
 		pr_err("Parsing file list \"%s\" failed: %pe\n", files, list);
 		return NULL;
 	}
+
 	return list;
 }
 
+static inline struct file_list *get_dfu_function(void)
+{
+	if (dfu_function && *dfu_function)
+		return file_list_parse(dfu_function);
+	if (!system_partitions_empty())
+		return system_partitions_get();
+	return NULL;
+}
+
 int usbgadget_register(bool dfu, const char *dfu_opts,
 		       bool fastboot, const char *fastboot_opts,
 		       bool acm, bool export_bbu)
@@ -39,17 +55,32 @@ int usbgadget_register(bool dfu, const char *dfu_opts,
 	int ret;
 	struct device_d *dev;
 	struct f_multi_opts *opts;
-	const char *fastboot_partitions = get_fastboot_partitions();
 
-	if (dfu && !dfu_opts && dfu_function && *dfu_function)
-		dfu_opts = dfu_function;
+	opts = xzalloc(sizeof(*opts));
+	opts->release = usb_multi_opts_release;
 
-	if (IS_ENABLED(CONFIG_FASTBOOT_BASE) && fastboot && !fastboot_opts &&
-	    fastboot_partitions && *fastboot_partitions)
-		fastboot_opts = fastboot_partitions;
+	opts->dfu_opts.files = parse(dfu_opts);
+	if (IS_ENABLED(CONFIG_USB_GADGET_DFU) && file_list_empty(opts->dfu_opts.files)) {
+		file_list_free(opts->dfu_opts.files);
+		opts->dfu_opts.files = get_dfu_function();
+	}
+
+	opts->fastboot_opts.files = parse(fastboot_opts);
+	if (IS_ENABLED(CONFIG_FASTBOOT_BASE) && file_list_empty(opts->fastboot_opts.files)) {
+		file_list_free(opts->fastboot_opts.files);
+		opts->fastboot_opts.files = get_fastboot_partitions();
+	}
+
+	if (fastboot)
+		opts->fastboot_opts.export_bbu = export_bbu;
 
-	if (!dfu_opts && !fastboot_opts && !acm)
-		return COMMAND_ERROR_USAGE;
+	opts->create_acm = acm;
+
+	if (usb_multi_count_functions(opts) == 0) {
+		pr_warn("No functions to register\n");
+		ret = COMMAND_ERROR_USAGE;
+		goto err;
+	}
 
 	/*
 	 * Creating a gadget with both DFU and Fastboot may not work.
@@ -57,35 +88,20 @@ int usbgadget_register(bool dfu, const char *dfu_opts,
 	 * seems to assume that the device only has a single configuration
 	 * That's not our fault though. Emit a warning and continue
 	 */
-	if (fastboot_opts && dfu_opts)
+	if (!file_list_empty(opts->fastboot_opts.files) && !file_list_empty(opts->dfu_opts.files))
 		pr_warn("Both DFU and Fastboot enabled. dfu-util may not like this!\n");
 
-	opts = xzalloc(sizeof(*opts));
-	opts->release = usb_multi_opts_release;
-
-	if (fastboot_opts) {
-		opts->fastboot_opts.files = parse(fastboot_opts);
-		opts->fastboot_opts.export_bbu = export_bbu;
-	}
-
-	if (dfu_opts)
-		opts->dfu_opts.files = parse(dfu_opts);
-
-	if (!opts->dfu_opts.files && !opts->fastboot_opts.files && !acm) {
-		pr_warn("No functions to register\n");
-		free(opts);
-		return 0;
-	}
-
-	opts->create_acm = acm;
-
 	dev = get_device_by_name("otg");
 	if (dev)
 		dev_set_param(dev, "mode", "peripheral");
 
 	ret = usb_multi_register(opts);
 	if (ret)
-		usb_multi_opts_release(opts);
+		goto err;
+
+	return 0;
+err:
+	usb_multi_opts_release(opts);
 
 	return ret;
 }
diff --git a/drivers/usb/gadget/multi.c b/drivers/usb/gadget/multi.c
index da4a7591175c..144ac0624be2 100644
--- a/drivers/usb/gadget/multi.c
+++ b/drivers/usb/gadget/multi.c
@@ -266,6 +266,18 @@ void usb_multi_unregister(void)
 	gadget_multi_opts = NULL;
 }
 
+unsigned usb_multi_count_functions(struct f_multi_opts *opts)
+{
+	unsigned count = 0;
+
+	count += !file_list_empty(opts->fastboot_opts.files) ||
+		opts->fastboot_opts.export_bbu;
+	count += !file_list_empty(opts->dfu_opts.files);
+	count += opts->create_acm;
+
+	return count;
+}
+
 void usb_multi_opts_release(struct f_multi_opts *opts)
 {
 	file_list_free(opts->fastboot_opts.files);
diff --git a/include/fastboot.h b/include/fastboot.h
index 2eab2dfe6ae8..cf8a177bf12c 100644
--- a/include/fastboot.h
+++ b/include/fastboot.h
@@ -58,16 +58,16 @@ enum fastboot_msg_type {
 
 #ifdef CONFIG_FASTBOOT_BASE
 bool get_fastboot_bbu(void);
-const char *get_fastboot_partitions(void);
+struct file_list *get_fastboot_partitions(void);
 #else
 static inline int get_fastboot_bbu(void)
 {
 	return false;
 }
 
-static inline const char *get_fastboot_partitions(void)
+static inline struct file_list *get_fastboot_partitions(void)
 {
-	return NULL;
+	return file_list_parse("");
 }
 #endif
 
diff --git a/include/file-list.h b/include/file-list.h
index 2538883c3659..be97a49b7a2b 100644
--- a/include/file-list.h
+++ b/include/file-list.h
@@ -35,4 +35,9 @@ struct file_list_entry *file_list_entry_by_name(struct file_list *files, const c
 #define file_list_for_each_entry(files, entry) \
 	list_for_each_entry(entry, &files->list, list)
 
+static inline bool file_list_empty(struct file_list *files)
+{
+	return !files || !files->num_entries;
+}
+
 #endif /* __FILE_LIST */
diff --git a/include/usb/gadget-multi.h b/include/usb/gadget-multi.h
index 9bb6c889f3e9..f30dae5686ae 100644
--- a/include/usb/gadget-multi.h
+++ b/include/usb/gadget-multi.h
@@ -15,6 +15,7 @@ struct f_multi_opts {
 int usb_multi_register(struct f_multi_opts *opts);
 void usb_multi_unregister(void);
 void usb_multi_opts_release(struct f_multi_opts *opts);
+unsigned usb_multi_count_functions(struct f_multi_opts *opts);
 
 int usbgadget_register(bool dfu, const char *dfu_opts,
 		       bool fastboot, const char *fastboot_opts,
diff --git a/net/fastboot.c b/net/fastboot.c
index 9082aa48f6e1..df388adc8995 100644
--- a/net/fastboot.c
+++ b/net/fastboot.c
@@ -499,7 +499,6 @@ void fastboot_net_free(struct fastboot_net *fbn)
 struct fastboot_net *fastboot_net_init(struct fastboot_opts *opts)
 {
 	struct fastboot_net *fbn;
-	const char *partitions = get_fastboot_partitions();
 	bool bbu = get_fastboot_bbu();
 	int ret;
 
@@ -513,8 +512,7 @@ struct fastboot_net *fastboot_net_init(struct fastboot_opts *opts)
 		fbn->fastboot.cmd_flash = opts->cmd_flash;
 		ret = fastboot_generic_init(&fbn->fastboot, opts->export_bbu);
 	} else {
-		fbn->fastboot.files = file_list_parse(partitions ?
-						      partitions : "");
+		fbn->fastboot.files = get_fastboot_partitions() ?: file_list_parse("");
 		ret = fastboot_generic_init(&fbn->fastboot, bbu);
 	}
 	if (ret)
-- 
2.29.2


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


^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2021-05-03 12:32 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-30 13:29 [PATCH v2 00/15] USB: gadget: refactor to allow easier extension Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 01/15] show_progress: add system wide progress stage notifier Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 02/15] common: console: add log_writefile to write log into new file Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 03/15] string: implement strstarts along with strends Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 04/15] vsprintf: introduce %m shorthand for "%s", strerror(errno) Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 05/15] param: introduce file-list parameter type Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 06/15] common: add generic system partitions interface Ahmad Fatoum
2021-04-30 13:39   ` [PATCH] fixup! " Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 07/15] fastboot: handle ill-named partitions gracefully Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 08/15] usb: gadget: dfu: change status message to info log level Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 09/15] usbgadget: autostart: fix indeterminism around usbgadget.autostart Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 10/15] usbgadget: allow DFU and Fastboot functions to coexist Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 11/15] fastboot/dfu: use system partitions as fall back Ahmad Fatoum
2021-04-30 17:57   ` [PATCH] fixup! " Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 12/15] bbu: add function to directly add handlers into file_list Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 13/15] file_list: add file_list_detect_all() Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 14/15] common: make FILE_LIST feature unconditional Ahmad Fatoum
2021-04-30 13:29 ` [PATCH v2 15/15] fs: error out when writing on read-only file system Ahmad Fatoum
2021-05-03 11:48 [PATCH 12/16] fastboot/dfu: use system partitions as fall back Ahmad Fatoum
2021-05-03 12:30 ` [PATCH] fixup! " Ahmad Fatoum

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox