mailarchive of the pengutronix oss-tools mailing list
 help / color / mirror / Atom feed
* [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base
@ 2022-10-14 16:41 Marco Felsch
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 01/14] state: Remove duplicate incudes Marco Felsch
                   ` (15 more replies)
  0 siblings, 16 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:41 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

Hi,

this series sync the dt-utils barebox-state code base with a very recent
barebox version [1]. The most import patch are patch13-14, since those adding
the user-space support for the backend format. By this new
backend-format we are able to store the barebox-state on a on-disk
partition like MBR/GPT.

[1] https://lore.barebox.org/barebox/20221014163534.3812272-1-m.felsch@pengutronix.de/T/#mb63a3ce9abdfc3091fff9d977e696232713fc247

Regards,
  Marco

Juergen Borleis (1):
  libdt: add partition search function

Marco Felsch (13):
  state: Remove duplicate incudes
  state: backend_raw: fix ignoring unpack failures
  state: backend_storage: deal gracefully with runtime bucket corruption
  state: treat state with all-invalid buckets as dirty
  state: remove param member from struct state_string
  state: remove param member from state_uint32, state_enum32, state_mac
  state: remove unused function
  state: propagate failure to fixup enum32 into DT
  state: add SPDX-License-Identifier for files without explicit license
  state: fix typos found with codespell
  common: xstrdup: don't panic on xstrdup(NULL)
  libdt: add of_property_write_strings support
  state: sync with barebox to support new backend type

 src/barebox-state/backend_format_raw.c |   6 +-
 src/barebox-state/backend_storage.c    |   2 +
 src/barebox-state/state.c              | 177 +++++++++++-----
 src/barebox-state/state.h              |  12 +-
 src/barebox-state/state_variables.c    |  38 ++--
 src/dt/common.h                        |  23 ++-
 src/dt/dt.h                            |   4 +
 src/libdt-utils.sym                    |   2 +
 src/libdt.c                            | 271 +++++++++++++++++++++++++
 9 files changed, 452 insertions(+), 83 deletions(-)

-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 01/14] state: Remove duplicate incudes
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
@ 2022-10-14 16:41 ` Marco Felsch
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 02/14] state: backend_raw: fix ignoring unpack failures Marco Felsch
                   ` (14 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:41 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

This ports the following barebox commit

| commit 870a96a80ba69f2e7d0312a84adecb70bd11ae4a
| Author: Alexander Shiyan <eagle.alexander923@gmail.com>
| Date:   Tue Jun 7 08:19:57 2022 +0300
|
|     treewide: Remove duplicate incudes
|
|     Fix warning fwterated by checkincludes.pl:
|     ./net/nfs.c: libgen.h is included more than once.
|     ./net/ifup.c: globalvar.h is included more than once.
|     ./crypto/rsa.c: asm/types.h is included more than once.
|     ./lib/decompress_unlz4.c: linux/decompress/mm.h is included more than once.
|     ./scripts/stb_image.h: stdio.h is included more than once.
|     ./scripts/kwbimage.c: unistd.h is included more than once.
|     ./scripts/common.c: sys/types.h is included more than once.
|     ./scripts/bareboximd.c: sys/types.h is included more than once.
|     ./scripts/bareboximd.c: sys/mman.h is included more than once.
|     ./fs/pstore/ram_core.c: linux/rslib.h is included more than once.
|     ./fs/pstore/fs.c: fs.h is included more than once.
|     ./fs/pstore/fs.c: linux/pstore.h is included more than once.
|     ./fs/nfs.c: fs.h is included more than once.
|     ./fs/uimagefs.c: fs.h is included more than once.
|     ./fs/fs.c: command.h is included more than once.
|     ./arch/sandbox/board/hostfile.c: linux/err.h is included more than once.
|     ./arch/sandbox/board/devices.c: mach/linux.h is included more than once.
|     ./arch/sandbox/os/common.c: signal.h is included more than once.
|     ./arch/arm/boards/zii-imx51-rdu1/board.c: envfs.h is included more than once.
|     ./arch/arm/boards/imx233-olinuxino/imx23-olinuxino.c: generated/mach-types.h is
|     ./arch/arm/mach-stm32mp/ddrctrl.c: mach/stm32.h is included more than once.
|     ./arch/arm/mach-imx/cpu_init.c: common.h is included more than once.
|     ./arch/arm/mach-imx/imx8m.c: mach/imx8m-ccm-regs.h is included more than once.
|     ./common/efi/payload/init.c: efi.h is included more than once.
|     ./common/state/backend_format_raw.c: common.h is included more than once.
|     ./common/state/backend_format_raw.c: crc.h is included more than once.
|     ./common/hush.c: libbb.h is included more than once.
|     ./drivers/spi/atmel-quadspi.c: linux/clk.h is included more than once.
|     ./drivers/spi/atmel-quadspi.c: linux/err.h is included more than once.
|     ./drivers/net/virtio.c: net.h is included more than once.
|     ./drivers/net/phy/phy.c: linux/phy.h is included more than once.
|     ./drivers/net/cpsw.c: net.h is included more than once.
|     ./drivers/virtio/virtio_pci_common.h: linux/list.h is included more than once.
|     ./drivers/usb/host/ohci-hcd.c: dma.h is included more than once.
|     ./drivers/usb/gadget/fsl_udc.c: dma.h is included more than once.
|     ./drivers/nvmem/eeprom_93xx46.c: spi/spi.h is included more than once.
|     ./drivers/nvmem/eeprom_93xx46.c: of.h is included more than once.
|     ./drivers/video/imx-ipu-v3/imx-ldb.c: linux/clk.h is included more than once.
|     ./drivers/video/imx-ipu-v3/imx-hdmi.c: linux/clk.h is included more than once.
|     ./drivers/video/omap.c: common.h is included more than once.
|     ./drivers/mtd/nand/nand_s3c24xx.c: asm/sections.h is included more than once.
|     ./drivers/clk/imx/clk-imx6sx.c: linux/clk.h is included more than once.
|     ./drivers/clk/imx/clk-imx6sl.c: linux/clk.h is included more than once.
|     ./commands/bootm.c: of.h is included more than once.
|
|     Signed-off-by: Alexander Shiyan <eagle.alexander923@gmail.com>
|     Link: https://lore.barebox.org/20220607051957.2497-1-eagle.alexander923@gmail.com
|     Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/barebox-state/backend_format_raw.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/barebox-state/backend_format_raw.c b/src/barebox-state/backend_format_raw.c
index 5a71149..9fade5d 100644
--- a/src/barebox-state/backend_format_raw.c
+++ b/src/barebox-state/backend_format_raw.c
@@ -15,7 +15,6 @@
  *
  */
 
-#include <common.h>
 #include <common.h>
 #include <crypto/keystore.h>
 #include <digest.h>
@@ -23,7 +22,6 @@
 #include <malloc.h>
 #include <crc.h>
 #include <of.h>
-#include <crc.h>
 
 #include "state.h"
 
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 02/14] state: backend_raw: fix ignoring unpack failures
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 01/14] state: Remove duplicate incudes Marco Felsch
@ 2022-10-14 16:41 ` Marco Felsch
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 03/14] state: backend_storage: deal gracefully with runtime bucket corruption Marco Felsch
                   ` (13 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:41 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

This ports the following barebox commit

| commit 9866966ef9b38bf49276c67f7e258bc2a8df55eb
| Author: Marco Felsch <m.felsch@pengutronix.de>
| Date:   Wed Aug 25 16:49:04 2021 +0200
|
|     state: backend_raw: fix ignoring unpack failures
|
|     This is required to inform the state framework that the state variable
|     set have changed and we need to write the new variable set. Without this
|     fix the new variable set is never written since the state never sets
|     dirty=1 and so state_save() will return early without saving the new
|     variable set.
|
|     Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
|     Link: https://lore.barebox.org/20210825144904.4929-1-m.felsch@pengutronix.de
|     Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/barebox-state/backend_format_raw.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/barebox-state/backend_format_raw.c b/src/barebox-state/backend_format_raw.c
index 9fade5d..982df12 100644
--- a/src/barebox-state/backend_format_raw.c
+++ b/src/barebox-state/backend_format_raw.c
@@ -181,6 +181,7 @@ static int backend_format_raw_unpack(struct state_backend_format *format,
 	const struct backend_raw_header *header;
 	const void *data;
 	struct state_backend_format_raw *backend_raw = get_format_raw(format);
+	int ret = 0;
 
 	header = (const struct backend_raw_header *)buf;
 	data = buf + sizeof(*header);
@@ -189,12 +190,13 @@ static int backend_format_raw_unpack(struct state_backend_format *format,
 		if (sv->start + sv->size > header->data_len) {
 			dev_err(backend_raw->dev, "State variable ends behind valid data, %s\n",
 				sv->name);
+			ret = -ENOSPC;
 			continue;
 		}
 		memcpy(sv->raw, data + sv->start, sv->size);
 	}
 
-	return 0;
+	return ret;
 }
 
 static int backend_format_raw_pack(struct state_backend_format *format,
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 03/14] state: backend_storage: deal gracefully with runtime bucket corruption
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 01/14] state: Remove duplicate incudes Marco Felsch
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 02/14] state: backend_raw: fix ignoring unpack failures Marco Felsch
@ 2022-10-14 16:41 ` Marco Felsch
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 04/14] state: treat state with all-invalid buckets as dirty Marco Felsch
                   ` (12 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:41 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

This ports the following barebox commit

| commit dc5100e6ba686fafd5570ce6d972383f047c7313
| Author: Ahmad Fatoum <a.fatoum@pengutronix.de>
| Date:   Thu Mar 5 08:40:31 2020 +0100
|
|     state: backend_storage: deal gracefully with runtime bucket corruption
|
|     Corrupting an already selected bucket and then reading it again will
|     crash barebox when it attempts the refresh:
|
|       barebox$ state -l
|       barebox$ mw -d /dev/eeprom0.state 0 0x42
|       barebox$ state -l
|       ERROR: state: No meta data header found
|       state: Using bucket 1@0x00000040
|       unable to handle NULL pointer dereference at address 0x00000000
|       pc : [<4fe4f1ea>]    lr : [<4fe0bcb1>]
|       sp : 4ffefd5c  ip : 00000000  fp : 2ff68f04
|       r10: 4ffefdc8  r9 : 4b434d63  r8 : 30155f50
|       r7 : 00000024  r6 : 2ff68b60  r5 : 2ff68e90  r4 : 00000000
|       r3 : 00000024  r2 : 00000024  r1 : 30155f50  r0 : 00000000
|       Flags: Nzcv  IRQs off  FIQs off  Mode SVC_32
|       WARNING: [<4fe4f1ea>] (memcmp+0x14/0x1a) from [<4fe0bcb1>] (bucket_refresh.isra.0+0x4d/0x78)
|       WARNING: [<4fe0bcb1>] (bucket_refresh.isra.0+0x4d/0x78) from [<4fe0be1d>] (state_storage_read+0xd1/0x104)
|       WARNING: [<4fe0be1d>] (state_storage_read+0xd1/0x104) from [<4fe0a5bd>] (state_do_load+0x1d/0x78)
|       WARNING: [<4fe0a5bd>] (state_do_load+0x1d/0x78) from [<4fe04137>] (execute_command+0x23/0x4c)
|
|     The memcmp called here is an optimization to skip I/O if the used bucket
|     and the one to be refreshed compare equal. Unfortunately, if the now
|     corrupt bucket was previously the used one, bucket->len will hold the
|     old value and we'll run into a NULL pointer dereference.
|
|     While this is quite inconvenient, it appears it doesn't affect
|     correctness: after the reset, the corrupt bucket will be refreshed
|     as expected.
|
|     Improve upon this by setting the length to zero when we are NULLing the
|     buffer. The zero length of the corrupted bucket will then compare unequal
|     to used_bucket->len in bucket_refresh() and ensure we will always refresh
|     the buffer if it becomes corrupted without an intermittent reset.
|
|     Fixes: 238008b4bd8f ("state: Drop cache bucket")
|     Cc: Enrico Jörns <ejo@pengutronix.de>
|     Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|     Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/barebox-state/backend_storage.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/barebox-state/backend_storage.c b/src/barebox-state/backend_storage.c
index 509427f..458f2a9 100644
--- a/src/barebox-state/backend_storage.c
+++ b/src/barebox-state/backend_storage.c
@@ -192,6 +192,7 @@ int state_storage_read(struct state_backend_storage *storage,
 		/* Free buffer from the unused buckets */
 		free(bucket->buf);
 		bucket->buf = NULL;
+		bucket->len = 0;
 	}
 
 	/*
@@ -204,6 +205,7 @@ int state_storage_read(struct state_backend_storage *storage,
 
 	/* buffer from the used bucket is passed to the caller, do not free */
 	bucket_used->buf = NULL;
+	bucket_used->len = 0;
 
 	return 0;
 }
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 04/14] state: treat state with all-invalid buckets as dirty
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (2 preceding siblings ...)
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 03/14] state: backend_storage: deal gracefully with runtime bucket corruption Marco Felsch
@ 2022-10-14 16:41 ` Marco Felsch
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 05/14] state: remove param member from struct state_string Marco Felsch
                   ` (11 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:41 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

This ports the following barebox commit

| commit f41e5160c8618455064a4ff4227105010cd56aaa
| Author: Ahmad Fatoum <a.fatoum@pengutronix.de>
| Date:   Thu Mar 5 08:40:32 2020 +0100
|
|     state: treat state with all-invalid buckets as dirty
|
|     The state.dirty flag controls whether state_save will actually
|     persist state. It is cleared when we successfully load or save
|     state and set on writing a state parameter.
|
|     When the state however becomes corrupt during barebox runtime and
|     state.dirty == 0, reinitializing the state to defaults is quite
|     cumbersome:
|
|     1. We reset twice. After the first reset, the dirty flag is reset
|        and before the second, state_save will reinitialize to defaults
|     2. We write any state variable and then run the state -s command
|
|     Both workarounds are quite obscure, improve the user experience
|     by having state -l set the dirty flag when it fails, so a subsequent
|     state -s may persist the default values to state.
|
|     Steps to reproduce:
|
|       barebox$ state -l
|       state: Using bucket 0@0x00000000
|       barebox$ memcpy -s /dev/zero -d /dev/eeprom0.state 0 0 0x400
|       barebox$ state -s
|       barebox$ state -l
|       ERROR: state: No meta data header found
|       ERROR: state: No meta data header found
|       ERROR: state: No meta data header found
|       ERROR: state: Failed to find any valid state copy in any bucket
|       ERROR: state: Failed to read state with format raw, -2
|       state: No such file or directory
|
|     Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|     Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/barebox-state/state.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/barebox-state/state.c b/src/barebox-state/state.c
index f528b3e..f6b7817 100644
--- a/src/barebox-state/state.c
+++ b/src/barebox-state/state.c
@@ -93,7 +93,7 @@ out:
  */
 static int state_do_load(struct state *state, enum state_flags flags)
 {
-	void *buf;
+	void *buf = NULL;
 	ssize_t len;
 	int ret;
 
@@ -102,7 +102,7 @@ static int state_do_load(struct state *state, enum state_flags flags)
 	if (ret) {
 		dev_err(&state->dev, "Failed to read state with format %s, %d\n",
 			state->format->name, ret);
-		return ret;
+		goto out;
 	}
 
 	ret = state->format->unpack(state->format, state, buf, len);
@@ -113,9 +113,8 @@ static int state_do_load(struct state *state, enum state_flags flags)
 	}
 
 	state->init_from_defaults = 0;
-	state->dirty = 0;
-
 out:
+	state->dirty = !!ret; /* mark dirty on error */
 	free(buf);
 	return ret;
 }
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 05/14] state: remove param member from struct state_string
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (3 preceding siblings ...)
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 04/14] state: treat state with all-invalid buckets as dirty Marco Felsch
@ 2022-10-14 16:41 ` Marco Felsch
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 06/14] state: remove param member from state_uint32, state_enum32, state_mac Marco Felsch
                   ` (10 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:41 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

This ports the following barebox commit

| commit 4f4d6fc426a466109b7f8b20fb2fdfaad9130aa3
| Author: Christian Eggers <ceggers@arri.de>
| Date:   Thu Jan 23 13:20:41 2020 +0100
|
|     state: remove param member from struct state_string
|
|     After adding the parameter, the pointer isn't required anymore.
|
|     Signed-off-by: Christian Eggers <ceggers@arri.de>
|     Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/barebox-state/state.h           | 1 -
 src/barebox-state/state_variables.c | 7 ++++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/barebox-state/state.h b/src/barebox-state/state.h
index 912d6d4..40450fe 100644
--- a/src/barebox-state/state.h
+++ b/src/barebox-state/state.h
@@ -191,7 +191,6 @@ struct state_mac {
  */
 struct state_string {
 	struct state_variable var;
-	struct param_d *param;
 	char *value;
 	const char *value_default;
 	char raw[];
diff --git a/src/barebox-state/state_variables.c b/src/barebox-state/state_variables.c
index 16f630f..18d9884 100644
--- a/src/barebox-state/state_variables.c
+++ b/src/barebox-state/state_variables.c
@@ -413,6 +413,7 @@ static struct state_variable *state_string_create(struct state *state,
 {
 	struct state_string *string;
 	uint32_t start_size[2];
+	struct param_d *param;
 	int ret;
 
 	ret = of_property_read_u32_array(node, "reg", start_size,
@@ -432,11 +433,11 @@ static struct state_variable *state_string_create(struct state *state,
 	string->var.raw = &string->raw;
 	string->var.state = state;
 
-	string->param = dev_add_param_string(&state->dev, name,
+	param = dev_add_param_string(&state->dev, name,
 					     state_string_set, state_string_get,
 					     &string->value, &string->var);
-	if (IS_ERR(string->param)) {
-		ret = PTR_ERR(string->param);
+	if (IS_ERR(param)) {
+		ret = PTR_ERR(param);
 		goto out;
 	}
 
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 06/14] state: remove param member from state_uint32, state_enum32, state_mac
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (4 preceding siblings ...)
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 05/14] state: remove param member from struct state_string Marco Felsch
@ 2022-10-14 16:41 ` Marco Felsch
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 07/14] state: remove unused function Marco Felsch
                   ` (9 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:41 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

This ports the following barebox commit

| commit 8718fd1f0508ed694569df212333fff9a22b5303
| Author: Christian Eggers <ceggers@arri.de>
| Date:   Thu Jan 23 13:20:43 2020 +0100
|
|     state: remove param member from state_uint32, state_enum32, state_mac
|
|     After adding the parameter, the pointer isn't required anymore.
|
|     Signed-off-by: Christian Eggers <ceggers@arri.de>
|     Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/barebox-state/state.h           |  3 ---
 src/barebox-state/state_variables.c | 16 ++++++++--------
 2 files changed, 8 insertions(+), 11 deletions(-)

diff --git a/src/barebox-state/state.h b/src/barebox-state/state.h
index 40450fe..1881d92 100644
--- a/src/barebox-state/state.h
+++ b/src/barebox-state/state.h
@@ -159,7 +159,6 @@ struct state_variable {
  */
 struct state_uint32 {
 	struct state_variable var;
-	struct param_d *param;
 	uint32_t value;
 	uint32_t value_default;
 };
@@ -169,7 +168,6 @@ struct state_uint32 {
  */
 struct state_enum32 {
 	struct state_variable var;
-	struct param_d *param;
 	uint32_t value;
 	uint32_t value_default;
 	const char **names;
@@ -181,7 +179,6 @@ struct state_enum32 {
  */
 struct state_mac {
 	struct state_variable var;
-	struct param_d *param;
 	uint8_t value[6];
 	uint8_t value_default[6];
 };
diff --git a/src/barebox-state/state_variables.c b/src/barebox-state/state_variables.c
index 18d9884..228a822 100644
--- a/src/barebox-state/state_variables.c
+++ b/src/barebox-state/state_variables.c
@@ -116,7 +116,6 @@ static struct state_variable *state_uint8_create(struct state *state,
 		return ERR_CAST(param);
 	}
 
-	su32->param = param;
 	su32->var.type = vtype;
 	su32->var.size = sizeof(uint8_t);
 #ifdef __LITTLE_ENDIAN
@@ -146,7 +145,6 @@ static struct state_variable *state_uint32_create(struct state *state,
 		return ERR_CAST(param);
 	}
 
-	su32->param = param;
 	su32->var.type = vtype;
 	su32->var.size = sizeof(uint32_t);
 	su32->var.raw = &su32->value;
@@ -226,6 +224,7 @@ static struct state_variable *state_enum32_create(struct state *state,
 						  const struct variable_type *vtype)
 {
 	struct state_enum32 *enum32;
+	struct param_d *param;
 	int ret, i, num_names;
 
 	enum32 = xzalloc(sizeof(*enum32));
@@ -253,11 +252,11 @@ static struct state_variable *state_enum32_create(struct state *state,
 		enum32->names[i] = xstrdup(name);
 	}
 
-	enum32->param = dev_add_param_enum(&state->dev, name, state_set_dirty,
+	param = dev_add_param_enum(&state->dev, name, state_set_dirty,
 					   NULL, &enum32->value, enum32->names,
 					   num_names, &enum32->var);
-	if (IS_ERR(enum32->param)) {
-		ret = PTR_ERR(enum32->param);
+	if (IS_ERR(param)) {
+		ret = PTR_ERR(param);
 		goto out;
 	}
 
@@ -310,6 +309,7 @@ static struct state_variable *state_mac_create(struct state *state,
 					       const struct variable_type *vtype)
 {
 	struct state_mac *mac;
+	struct param_d *param;
 	int ret;
 
 	mac = xzalloc(sizeof(*mac));
@@ -319,10 +319,10 @@ static struct state_variable *state_mac_create(struct state *state,
 	mac->var.raw = mac->value;
 	mac->var.state = state;
 
-	mac->param = dev_add_param_mac(&state->dev, name, state_set_dirty,
+	param = dev_add_param_mac(&state->dev, name, state_set_dirty,
 				       NULL, mac->value, &mac->var);
-	if (IS_ERR(mac->param)) {
-		ret = PTR_ERR(mac->param);
+	if (IS_ERR(param)) {
+		ret = PTR_ERR(param);
 		goto out;
 	}
 
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 07/14] state: remove unused function
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (5 preceding siblings ...)
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 06/14] state: remove param member from state_uint32, state_enum32, state_mac Marco Felsch
@ 2022-10-14 16:41 ` Marco Felsch
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 08/14] state: propagate failure to fixup enum32 into DT Marco Felsch
                   ` (8 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:41 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

This ports the following barebox commit

| commit 418769972dca8ff6af08eabcf47cfe70aaa3cd43
| Author: Sascha Hauer <s.hauer@pengutronix.de>
| Date:   Mon Nov 19 09:34:19 2018 +0100
|
|     state: remove unused function
|
|     state_find_type() is unused and doesn't have a prototype. Remove it.
|
|     Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/barebox-state/state_variables.c | 13 -------------
 1 file changed, 13 deletions(-)

diff --git a/src/barebox-state/state_variables.c b/src/barebox-state/state_variables.c
index 228a822..66c66f3 100644
--- a/src/barebox-state/state_variables.c
+++ b/src/barebox-state/state_variables.c
@@ -493,19 +493,6 @@ struct variable_type *state_find_type_by_name(const char *name)
 	return NULL;
 }
 
-struct variable_type *state_find_type(const enum state_variable_type type)
-{
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(types); i++) {
-		if (type == types[i].type) {
-			return &types[i];
-		}
-	}
-
-	return NULL;
-}
-
 struct state_variable *state_find_var(struct state *state, const char *name)
 {
 	struct state_variable *sv;
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 08/14] state: propagate failure to fixup enum32 into DT
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (6 preceding siblings ...)
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 07/14] state: remove unused function Marco Felsch
@ 2022-10-14 16:41 ` Marco Felsch
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 09/14] state: add SPDX-License-Identifier for files without explicit license Marco Felsch
                   ` (7 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:41 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

This ports the following barebox commit

| commit 2628c8a8e1eee3cf6727c0c8a99ff5eec8ba4d1e
| Author: Ahmad Fatoum <a.fatoum@pengutronix.de>
| Date:   Mon Sep 5 11:55:35 2022 +0200
|
|     state: propagate failure to fixup enum32 into DT
|
|     We assign to ret, but don't use the value anywhere laments the static
|     analyzer. Remedy that.
|
|     Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|     Link: https://lore.barebox.org/20220905095557.596891-11-a.fatoum@pengutronix.de
|     Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/barebox-state/state_variables.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/barebox-state/state_variables.c b/src/barebox-state/state_variables.c
index 66c66f3..5d86900 100644
--- a/src/barebox-state/state_variables.c
+++ b/src/barebox-state/state_variables.c
@@ -180,6 +180,8 @@ static int state_enum32_export(struct state_variable *var,
 		str += sprintf(str, "%s", enum32->names[i]) + 1;
 
 	ret = of_set_property(node, "names", prop, len, 1);
+	if (ret)
+		return ret;
 
 	free(prop);
 
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 09/14] state: add SPDX-License-Identifier for files without explicit license
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (7 preceding siblings ...)
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 08/14] state: propagate failure to fixup enum32 into DT Marco Felsch
@ 2022-10-14 16:41 ` Marco Felsch
  2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 10/14] state: fix typos found with codespell Marco Felsch
                   ` (6 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:41 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

This ports the following barebox commit

| commit 79cd45e6eb62c0599d82c768fbfe226eaf750340
| Author: Ahmad Fatoum <a.fatoum@pengutronix.de>
| Date:   Mon Jan 3 13:05:39 2022 +0100
|
|     treewide: add SPDX-License-Identifier for files without explicit license
|
|     Record GPL-2.0-only as license for all files lacking an explicit license
|     statement.
|
|     Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|     Link: https://lore.barebox.org/20220103120539.1730644-12-a.fatoum@pengutronix.de
|     Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/barebox-state/state.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/barebox-state/state.h b/src/barebox-state/state.h
index 1881d92..719f7e4 100644
--- a/src/barebox-state/state.h
+++ b/src/barebox-state/state.h
@@ -1,3 +1,5 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
 #include <linux/types.h>
 #include <linux/list.h>
 #include <driver.h>
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 10/14] state: fix typos found with codespell
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (8 preceding siblings ...)
  2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 09/14] state: add SPDX-License-Identifier for files without explicit license Marco Felsch
@ 2022-10-14 16:42 ` Marco Felsch
  2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 11/14] common: xstrdup: don't panic on xstrdup(NULL) Marco Felsch
                   ` (5 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:42 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

This ports the following barebox commit

| commit 157e861aa6e93a72018c408e82863a3253550a4d
| Author: Yegor Yefremov <yegorslists@googlemail.com>
| Date:   Fri Mar 20 10:41:19 2020 +0100
|
|     common: fix typos found with codespell
|
|     Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
|     Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/barebox-state/state.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/barebox-state/state.c b/src/barebox-state/state.c
index f6b7817..4779574 100644
--- a/src/barebox-state/state.c
+++ b/src/barebox-state/state.c
@@ -698,7 +698,7 @@ struct state *state_by_name(const char *name)
 /*
  * state_by_node - find a state instance by of node
  *
- * @node	The of node of the state intance
+ * @node	The of node of the state instance
  */
 struct state *state_by_node(const struct device_node *node)
 {
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 11/14] common: xstrdup: don't panic on xstrdup(NULL)
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (9 preceding siblings ...)
  2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 10/14] state: fix typos found with codespell Marco Felsch
@ 2022-10-14 16:42 ` Marco Felsch
  2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 12/14] libdt: add of_property_write_strings support Marco Felsch
                   ` (4 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:42 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

This ports the following barebox commit

| commit bf6ddd6c4dccf01c4a27761c5f73918db578f8d6
| Author: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
| Date:   Fri Sep 9 08:37:22 2016 +0200
|
|     xstrdup: don't panic on xstrdup(NULL)
|
|     Instead return just NULL. This matches the behaviour of kstrdup in the
|     kernel and xstrdup in busybox.
|
|     This fixes a panic with CONFIG_CMD_MAGICVAR=y and
|     CONFIG_CMD_MAGICVAR_HELP unset in magicvar_add() where description is
|     always NULL.
|
|     Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
|     Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

It is required to have the same logic for the code shared with barebox.

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/dt/common.h | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/dt/common.h b/src/dt/common.h
index c3c4f53..9b1c169 100644
--- a/src/dt/common.h
+++ b/src/dt/common.h
@@ -209,8 +209,12 @@ static inline char * safe_strncpy(char *dst, const char *src, size_t size)
 
 static inline char *xstrdup(const char *s)
 {
-	char *p = strdup(s);
+	char *p;
+
+	if (!s)
+		return NULL;
 
+	p = strdup(s);
 	if (!p)
 		exit(EXIT_FAILURE);
 
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 12/14] libdt: add of_property_write_strings support
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (10 preceding siblings ...)
  2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 11/14] common: xstrdup: don't panic on xstrdup(NULL) Marco Felsch
@ 2022-10-14 16:42 ` Marco Felsch
  2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 13/14] libdt: add partition search function Marco Felsch
                   ` (3 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:42 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

The function is copied from barebox and based on commit

| commit 09cbc3fbdab5f3118062ceeefb0c1b043a75b3fb
| Author: Ahmad Fatoum <a.fatoum@pengutronix.de>
| Date:   Wed Sep 30 14:53:01 2020 +0200
|
|     of: implement of_property_write_strings for multiple strings
|
|     The current way to set a property with multiple values (e.g. compatible
|     strings) is to have
|
|       char properties[] = "st,stm32mp157c-dk2\0st,stm32mp157";
|       of_set_property(np, "compatible", properties, sizeof(properties), 1);
|
|     Add a new helper to make this easier at the cost of one runtime
|     reallocation:
|
|       of_property_write_strings(np, "compatible,
|             "st,stm32mp157c-dk2", "st,stm32mp157", NULL);
|
|     Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|     Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/dt/dt.h         |  2 ++
 src/libdt-utils.sym |  1 +
 src/libdt.c         | 47 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 50 insertions(+)

diff --git a/src/dt/dt.h b/src/dt/dt.h
index 4ae24ba..97dd855 100644
--- a/src/dt/dt.h
+++ b/src/dt/dt.h
@@ -195,6 +195,8 @@ extern int of_property_write_u64_array(struct device_node *np,
 				size_t sz);
 extern int of_property_write_string(struct device_node *np,
 				const char *propname, const char *value);
+extern int of_property_write_strings(struct device_node *np,
+		const char *propname, ...) __attribute__((__sentinel__));
 
 extern struct device_node *of_parse_phandle(const struct device_node *np,
 					    const char *phandle_name,
diff --git a/src/libdt-utils.sym b/src/libdt-utils.sym
index 2c63d55..a749317 100644
--- a/src/libdt-utils.sym
+++ b/src/libdt-utils.sym
@@ -64,6 +64,7 @@ global:
 	of_property_read_u8_array;
 	of_property_write_bool;
 	of_property_write_string;
+	of_property_write_strings;
 	of_property_write_u16_array;
 	of_property_write_u32_array;
 	of_property_write_u64_array;
diff --git a/src/libdt.c b/src/libdt.c
index 59e76d3..f18ea90 100644
--- a/src/libdt.c
+++ b/src/libdt.c
@@ -1208,6 +1208,53 @@ int of_property_write_u64_array(struct device_node *np,
 	return 0;
 }
 
+/**
+ * of_property_write_strings - Write strings to a property. If
+ * the property does not exist, it will be created and appended to the given
+ * device node.
+ *
+ * @np:		device node to which the property value is to be written.
+ * @propname:	name of the property to be written.
+ * @...:	pointers to strings to write
+ *
+ * Search for a property in a device node and write a string to
+ * it. If the property does not exist, it will be created and appended to
+ * the device node. Returns 0 on success, -ENOMEM if the property or array
+ * of elements cannot be created, -EINVAL if no strings specified.
+ */
+int of_property_write_strings(struct device_node *np,
+			      const char *propname, ...)
+{
+	const char *val;
+	char *buf = NULL, *next;
+	size_t len = 0;
+	va_list ap;
+	int ret = 0;
+
+	va_start(ap, propname);
+	for (val = va_arg(ap, char *); val; val = va_arg(ap, char *))
+		len += strlen(val) + 1;
+	va_end(ap);
+
+	if (!len)
+		return -EINVAL;
+
+	buf = malloc(len);
+	if (!buf)
+		return -ENOMEM;
+
+	next = buf;
+
+	va_start(ap, propname);
+	for (val = va_arg(ap, char *); val; val = va_arg(ap, char *))
+		next = stpcpy(next, val) + 1;
+	va_end(ap);
+
+	ret = of_set_property(np, propname, buf, len, 1);
+	free(buf);
+	return ret;
+}
+
 /**
  * of_property_write_string - Write a string to a property. If
  * the property does not exist, it will be created and appended to the given
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 13/14] libdt: add partition search function
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (11 preceding siblings ...)
  2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 12/14] libdt: add of_property_write_strings support Marco Felsch
@ 2022-10-14 16:42 ` Marco Felsch
  2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 14/14] state: sync with barebox to support new backend type Marco Felsch
                   ` (2 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:42 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

From: Juergen Borleis <jbe@pengutronix.de>

Add of_find_path() support which mimics the of_find_path() from barebox.
The purpose of this function is to get the device path specified by a
device-tree property like:

   - proptery = &mmc2, partname:0;
   - property = &of_partition;

Signed-off-by: Juergen Borleis <jbe@pengutronix.de>
[m.felsch@pengutronix.de: adapt commit message]
[m.felsch@pengutronix.de: fix of-partition use-case]
[m.felsch@pengutronix.de: use the correct udev_list_entry variable]
[m.felsch@pengutronix.de: of_find_path function behaviour with barebox]
[m.felsch@pengutronix.de: drop partuuid suport since barbeox don't support ot either]
Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/dt/dt.h         |   2 +
 src/libdt-utils.sym |   1 +
 src/libdt.c         | 224 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 227 insertions(+)

diff --git a/src/dt/dt.h b/src/dt/dt.h
index 97dd855..7c27259 100644
--- a/src/dt/dt.h
+++ b/src/dt/dt.h
@@ -229,6 +229,8 @@ void of_add_memory_bank(struct device_node *node, bool dump, int r,
 
 int of_get_devicepath(struct device_node *partition_node, char **devnode, off_t *offset,
 		size_t *size);
+int of_find_path(struct device_node *node, const char *propname, char **devpath,
+		 off_t *offset, size_t *size);
 
 #define for_each_node_by_name(dn, name) \
 	for (dn = of_find_node_by_name(NULL, name); dn; \
diff --git a/src/libdt-utils.sym b/src/libdt-utils.sym
index a749317..441c8ef 100644
--- a/src/libdt-utils.sym
+++ b/src/libdt-utils.sym
@@ -34,6 +34,7 @@ global:
 	of_get_child_by_name;
 	of_get_child_count;
 	of_get_devicepath;
+	of_find_path;
 	of_get_next_available_child;
 	of_get_parent;
 	of_get_property;
diff --git a/src/libdt.c b/src/libdt.c
index f18ea90..89ef501 100644
--- a/src/libdt.c
+++ b/src/libdt.c
@@ -30,6 +30,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <libudev.h>
+#include <limits.h>
 #include <dt.h>
 
 static int pr_level = 5;
@@ -2234,6 +2235,137 @@ out:
 	return ret;
 }
 
+/**
+ * libdt_udev_scan_restrict - Restrict a udev scan to a specific device
+ * @e:		The scan enumerater to restrict to a specific device
+ * @specifier:	Describes the device in question in more detail
+ *
+ * Since property matches are or'ed, we can only add exactly one match based on
+ * a specific property value.
+ *
+ * Note: this function isn't thread save
+ */
+static int libdt_udev_scan_restrict(struct udev_enumerate *e, const char *specifier)
+{
+	static char part_number_match[16];
+	unsigned long int part_no;
+	char *eptr;
+
+	/*
+	 * The variables: 'PARTN' (for <number>) or 'PARTNAME' (for <name>) can
+	 * be queried by:
+	 *   udevadm info -q all /dev/<partition device node>
+	 */
+
+	/* "partname:<name>" use case */
+	if (!isdigit(*specifier))
+		return udev_enumerate_add_match_property(e, "PARTNAME", specifier);
+
+	/*
+	 * "partname:<number>" use case
+	 * It's a little bit more complicated, since the bootloader
+	 * counts beginning with '0', while userland counts
+	 * beginning with '1'. Thus, we need to increase the partition
+	 * number by one here - and we need it as a string.
+	 */
+	part_no = strtoul(specifier, &eptr, 10);
+	if (part_no == 0 && specifier == eptr) {
+		fprintf(stderr, "Numerical partition count value expected - but found invalid value: '%s'\n", specifier);
+		return -EINVAL;
+	}
+	if (part_no == ULONG_MAX && errno == ERANGE) {
+		fprintf(stderr, "Numerical partition count expected - but found invalid number: '%s'\n", specifier);
+		return -ERANGE;
+	}
+
+	snprintf(part_number_match, sizeof(part_number_match), "%ld", part_no + 1);
+	udev_enumerate_add_match_property(e, "PARTN", part_number_match);
+	return 0;
+}
+
+/**
+ * device_find_blockdev_partition - Retrieve the device node path to a block device
+ * 				    (which can be a of-partition as well)
+ * @parent:		The base block device or of-partition
+ * @part_specifier:	Specifier to define a unique partition on @parent
+ * @devpath:		Return the corresponding path to the device node
+ * 			(e.g. /dev/<something>)
+ *
+ * Returns 0 on success (e.g. @devpath is valid) or a negative errno else
+ *
+ * @part_specifier is a string and can be one of:
+ * - "partname:<number>": restrict the scan to a partition with index <number> + 1
+ *   - can be used in conjuntion with MBR or GPT partitions
+ * - "partname:<name>": restrict the scan to a partition with name <name>
+ *   - can be used in conjuntion with GPT partitions
+ */
+static int device_find_blockdev_partition(struct udev_device *parent, const char *part_specifier, char **devpath)
+{
+	struct udev_list_entry *device_list, *dev_entry;
+	struct udev_enumerate *enumerate;
+	struct udev_device *part = NULL;
+	const char *devnode_path;
+	const char *sys_path;
+	struct udev *udev;
+	int ret;
+
+	udev = udev_new();
+	if (!udev) {
+		  fprintf(stderr, "Failed to create udev context when retrieving block device nodes\n");
+		  return -ENODEV;
+	}
+	/*
+	 * Create an enumation context to match exactly one device
+	 * Note: the following matches are and'ed (one per group)
+	 */
+	enumerate = udev_enumerate_new(udev);
+
+	/* We are interested only in devices related to the given parent device */
+	udev_enumerate_add_match_parent(enumerate, parent);
+	/* We are interested only in subsystem 'block' devices */
+	udev_enumerate_add_match_subsystem(enumerate, "block");
+	/* We are interested in a unique ID */
+	ret = libdt_udev_scan_restrict(enumerate, part_specifier);
+	if (ret)
+		goto leave;
+
+	udev_enumerate_scan_devices(enumerate);
+
+	/* Note: this list should contain none or max *one* device */
+	device_list = udev_enumerate_get_list_entry(enumerate);
+	if (device_list == NULL) {
+		fprintf(stderr, "No device matches the partition specifier: '%s'\n", part_specifier);
+		ret = -ENODEV;
+		goto leave;
+	}
+
+	sys_path = udev_list_entry_get_name(device_list);
+	part = udev_device_new_from_syspath(udev, sys_path);
+	devnode_path = udev_device_get_devnode(part);
+
+	/* Ensure only one match is in the list */
+	dev_entry = udev_list_entry_get_next(device_list);
+	if (dev_entry == NULL) {
+		*devpath = strdup(devnode_path);
+		ret = 0;
+	} else {
+		fprintf(stderr, "Unexpected behaviour of udev matches: a single partition device node expected, but got more than one.\n");
+		fprintf(stderr, " One match to '%s'", devnode_path);
+		udev_device_unref(part);
+		sys_path = udev_list_entry_get_name(dev_entry);
+		part = udev_device_new_from_syspath(udev, sys_path);
+		fprintf(stderr, "  and (at least) one more to '%s'\n", udev_device_get_devnode(part));
+		ret = -ENODEV;
+	}
+
+	udev_device_unref(part);
+leave:
+	udev_enumerate_unref(enumerate);
+	udev_unref(udev);
+
+	return ret;
+}
+
 /*
  * of_parse_partition - extract offset and size from a partition device_node
  *
@@ -2532,3 +2664,95 @@ int of_get_devicepath(struct device_node *partition_node, char **devpath, off_t
 
 	return -EINVAL;
 }
+
+static int libdt_partition_size_get(const char *dev_node, size_t *size)
+{
+	struct stat fstat;
+	int rc;
+
+	rc = stat(dev_node, &fstat);
+	if (rc < 0) {
+		rc = -errno;
+		fprintf(stderr, "Failed to get the size of state's partition based backend memory via '%s': %m\n", dev_node);
+		return rc;
+	}
+
+	if (fstat.st_size > SIZE_MAX) {
+		fprintf(stderr, "Partition size of '%s' too big to fit into a size_t type. Cannot continue.\n", dev_node);
+		return -ERANGE;
+	}
+
+	*size = fstat.st_size;
+	return 0;
+}
+
+/**
+ * of_find_path - Translates a path description in the devicetree to a Linux
+ *                device path
+ *
+ * @node: the node containing the property with the path description
+ * @propname: the property name of the path description
+ * @devpath: if this function returns 0 devpath will contain the path belonging
+ *           to the input path description.
+ * @offset: Returns the offset to be used inside the partition device (always 0)
+ * @size: Returns the size of the partition device
+ *
+ * paths in the devicetree have the form of a multistring property. The first
+ * string contains the full path to the physical device containing the path or
+ * a full path to a partition described by the OF partition binding.
+ * The remaining strings have the form "<type>:<options>". Currently supported
+ * for <type> are:
+ *
+ * partname:<partname> - find a partition by its partition name. For mtd
+ *                       partitions this is the label. For DOS partitions
+ *                       this is the number beginning with 0.
+ *
+ * examples:
+ *
+ * device-path = &mmc0, "partname:0";
+ * device-path = &norflash, "partname:barebox-environment";
+ * device-path = &environment_nor;
+ */
+
+int of_find_path(struct device_node *node, const char *propname, char **devpath,
+		 off_t *offset, size_t *size)
+{
+	const char partnamestr[] = "partname:";
+	struct device_node *rnode;
+	struct udev_device *udev;
+	const char *part = NULL;
+	const char *path;
+	int rc;
+
+	path = of_get_property(node, propname, NULL);
+	if (!path)
+		return -EINVAL;
+
+	rnode = of_find_node_by_path(path);
+	if (!rnode)
+		return -ENODEV;
+
+	of_property_read_string_index(node, propname, 1, &part);
+	if (part) {
+		if (!strncmp(part, partnamestr, sizeof(partnamestr) - 1)) {
+			part += sizeof(partnamestr) - 1;
+		} else {
+			pr_err("Invalid device-path: %s\n", part);
+			return -EINVAL;
+		}
+	} else {
+		/* of-partition use-case */
+		return of_get_devicepath(rnode, devpath, offset, size);
+	}
+
+	udev = of_find_device_by_node_path(rnode->full_name);
+	if (udev) {
+		*offset = 0;
+		rc = device_find_blockdev_partition(udev, part, devpath);
+		if (rc < 0)
+			return rc;
+		return libdt_partition_size_get(*devpath, size);
+	}
+
+	return -EINVAL;
+}
-- 
2.30.2




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

* [OSS-Tools] [PATCH dt-utils 14/14] state: sync with barebox to support new backend type
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (12 preceding siblings ...)
  2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 13/14] libdt: add partition search function Marco Felsch
@ 2022-10-14 16:42 ` Marco Felsch
  2022-10-21  7:37 ` [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
  2023-06-05 13:12 ` Ahmad Fatoum
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-14 16:42 UTC (permalink / raw)
  To: oss-tools; +Cc: mfe

The state backend format was changed from a phandle based description to
a string based description. This was done because of the missing support
to store the state within a on-disk partition like MBR/GPT. By this sync
we import the code required to manipulate the state which is stored on a
on-disk partition.

Furthermore the sync did a few minor style fixes.

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 src/barebox-state/state.c | 168 ++++++++++++++++++++++++++++----------
 src/barebox-state/state.h |   6 +-
 src/dt/common.h           |  17 ++++
 3 files changed, 145 insertions(+), 46 deletions(-)

diff --git a/src/barebox-state/state.c b/src/barebox-state/state.c
index 4779574..e8c08d6 100644
--- a/src/barebox-state/state.c
+++ b/src/barebox-state/state.c
@@ -40,11 +40,11 @@ static LIST_HEAD(state_list);
  */
 int state_save(struct state *state)
 {
-	void *buf;
-	ssize_t len;
-	int ret;
 	struct state_backend_storage_bucket *bucket;
 	struct state_backend_storage *storage;
+	ssize_t len;
+	void *buf;
+	int ret;
 
 	if (!state->dirty)
 		return 0;
@@ -211,13 +211,13 @@ static int state_convert_node_variable(struct state *state,
 				       const char *parent_name,
 				       enum state_convert conv)
 {
+	struct device_node *new_node = NULL;
 	const struct variable_type *vtype;
+	char *short_name, *name, *indexs;
+	unsigned int start_size[2];
 	struct device_node *child;
-	struct device_node *new_node = NULL;
 	struct state_variable *sv;
 	const char *type_name;
-	char *short_name, *name, *indexs;
-	unsigned int start_size[2];
 	int ret;
 
 	/* strip trailing @<ADDRESS> */
@@ -341,8 +341,8 @@ struct device_node *state_to_node(struct state *state,
 				  struct device_node *parent,
 				  enum state_convert conv)
 {
-	struct device_node *child;
 	struct device_node *root, *state_root;
+	struct device_node *child;
 	int ret;
 
 	state_root = of_find_node_by_path(state->of_path);
@@ -369,8 +369,8 @@ int state_from_node(struct state *state, struct device_node *node, bool create)
 {
 	struct device_node *child;
 	enum state_convert conv;
-	int ret;
 	uint32_t magic;
+	int ret;
 
 	ret = of_property_read_u32(node, "magic", &magic);
 	if (ret)
@@ -428,12 +428,11 @@ int state_from_node(struct state *state, struct device_node *node, bool create)
 
 static int of_state_fixup(struct device_node *root, void *ctx)
 {
-	struct state *state = ctx;
-	const char *compatible = "barebox,state";
 	struct device_node *new_node, *node, *parent, *backend_node, *aliases;
+	const char *compatible = "barebox,state";
+	struct state *state = ctx;
 	struct property *p;
 	int ret;
-	phandle phandle;
 
 	node = of_find_node_by_path_from(root, state->of_path);
 	if (node) {
@@ -493,16 +492,26 @@ static int of_state_fixup(struct device_node *root, void *ctx)
 
 	/* backend phandle */
 	backend_node = of_find_node_by_reproducible_name(root,
-						state->backend_reproducible_name);
+						state->backend_dts_dev_or_part);
 	if (!backend_node) {
 		ret = -ENODEV;
 		goto out;
 	}
 
-	phandle = of_node_create_phandle(backend_node);
-	ret = of_property_write_u32(new_node, "backend", phandle);
-	if (ret)
-		goto out;
+	if (state->backend_is_new_format) {
+		ret = of_property_write_strings(new_node, "backend",
+						backend_node->full_name,
+						state->backend_dts_partition, NULL);
+		if (ret)
+			goto out;
+	} else {
+		phandle phandle;
+
+		phandle = of_node_create_phandle(backend_node);
+		ret = of_property_write_u32(new_node, "backend", phandle);
+		if (ret)
+			goto out;
+	}
 
 	if (!strcmp("raw", state->format->name)) {
 		struct digest *digest =
@@ -572,12 +581,86 @@ void state_release(struct state *state)
 	unregister_device(&state->dev);
 	state_storage_free(&state->storage);
 	state_format_free(state->format);
-	free(state->backend_path);
-	free(state->backend_reproducible_name);
+	free(state->backend_dev_path);
+	free(state->backend_dts_dev_or_part);
+	free(state->backend_dts_partition);
 	free(state->of_path);
 	free(state);
 }
 
+#ifdef __BAREBOX__
+
+#define state_of_find_path_by_node(node, path, flags, offset, size) \
+	of_find_path_by_node(node, path, flags)
+#define state_of_find_path(node, propname, outpath, flags, offset, size) \
+	of_find_path(node, propname, outpath, flags)
+
+#else
+
+#define state_of_find_path_by_node(node, path, flags, offset, size) \
+	of_get_devicepath(node, path, offset, size)
+#define state_of_find_path(node, propname, outpath, flags, offset, size) \
+	of_find_path(node, propname, outpath, offset, size)
+
+#endif /* __BAREBOX__ */
+
+static int
+state_parse_old_backend_format(struct device_node *backend_node,
+			       struct state *state, off_t *offset, size_t *size)
+{
+	int ret;
+
+	ret = of_partition_ensure_probed(backend_node);
+	if (ret)
+		return ret;
+
+	ret = state_of_find_path_by_node(backend_node, &state->backend_dev_path,
+					 0, offset, size);
+	if (ret) {
+		if (ret != -EPROBE_DEFER)
+			dev_err(&state->dev, "state failed to parse path to backend: %s\n",
+			       strerror(-ret));
+		return ret;
+	}
+
+	state->backend_dts_dev_or_part = of_get_reproducible_name(backend_node);
+
+	return 0;
+}
+
+static int
+state_parse_new_backend_format(struct device_node *state_node,
+			       struct state *state, off_t *offset, size_t *size)
+{
+	struct device_node *backend_node;
+	const char *backend_dev_or_part;
+	const char *part = NULL;
+	int ret;
+
+	backend_dev_or_part = of_get_property(state_node, "backend", NULL);
+	if (!backend_dev_or_part)
+		return -EINVAL;
+
+	backend_node = of_find_node_by_path(backend_dev_or_part);
+	if (!backend_node)
+		return -ENODEV;
+
+	if (is_of_partition(backend_node))
+		ret = of_partition_ensure_probed(backend_node);
+	else
+		ret = of_device_ensure_probed(backend_node);
+	if (ret)
+		return ret;
+
+	of_property_read_string_index(state_node, "backend", 1, &part);
+	state->backend_dts_dev_or_part = of_get_reproducible_name(backend_node);
+	state->backend_dts_partition = xstrdup(part);
+	state->backend_is_new_format = true;
+
+	return state_of_find_path(state_node, "backend",
+				  &state->backend_dev_path, 0, offset, size);
+}
+
 /*
  * state_new_from_node - create a new state instance from a device_node
  *
@@ -587,15 +670,15 @@ void state_release(struct state *state)
  */
 struct state *state_new_from_node(struct device_node *node, bool readonly)
 {
-	struct state *state;
-	int ret = 0;
-	const char *backend_type;
+	struct device_node *backend_node;
 	const char *storage_type = NULL;
-	const char *alias;
+	const char *backend_type;
+	struct state *state;
 	uint32_t stridesize;
-	struct device_node *partition_node;
+	const char *alias;
 	off_t offset = 0;
 	size_t size = 0;
+	int ret;
 
 	alias = of_alias_get(node);
 	if (!alias) {
@@ -607,26 +690,23 @@ struct state *state_new_from_node(struct device_node *node, bool readonly)
 	if (IS_ERR(state))
 		return state;
 
-	partition_node = of_parse_phandle(node, "backend", 0);
-	if (!partition_node) {
-		dev_err(&state->dev, "Cannot resolve \"backend\" phandle\n");
-		ret = -EINVAL;
-		goto out_release_state;
-	}
-
-#ifdef __BAREBOX__
-	ret = of_find_path_by_node(partition_node, &state->backend_path, 0);
-#else
-	ret = of_get_devicepath(partition_node, &state->backend_path, &offset, &size);
-#endif
-	if (ret) {
-		if (ret != -EPROBE_DEFER)
-			dev_err(&state->dev, "state failed to parse path to backend: %s\n",
-			       strerror(-ret));
+	/*
+	 * backend can be in three formats:
+	 *  old) backend = <&state_part>;
+	 *  new) backend = &state_part;
+	 *       backend = &state_part_dev, "partname:0";
+	 *
+	 * Start with the old format for compatibility reasons.
+	 */
+	backend_node = of_parse_phandle(node, "backend", 0);
+	if (backend_node)
+		ret = state_parse_old_backend_format(backend_node, state,
+						     &offset, &size);
+	else
+		ret = state_parse_new_backend_format(node, state,
+						     &offset, &size);
+	if (ret)
 		goto out_release_state;
-	}
-
-	state->backend_reproducible_name = of_get_reproducible_name(partition_node);
 
 	ret = of_property_read_string(node, "backend-type", &backend_type);
 	if (ret) {
@@ -649,7 +729,7 @@ struct state *state_new_from_node(struct device_node *node, bool readonly)
 	if (ret)
 		goto out_release_state;
 
-	ret = state_storage_init(state, state->backend_path, offset,
+	ret = state_storage_init(state, state->backend_dev_path, offset,
 				 size, stridesize, storage_type);
 	if (ret)
 		goto out_release_state;
@@ -744,7 +824,7 @@ void state_info(void)
 		if (state->format)
 			printf("(backend: %s, path: %s)\n",
 			       state->format->name,
-			       state->backend_path);
+			       state->backend_dev_path);
 		else
 			printf("(no backend)\n");
 	}
diff --git a/src/barebox-state/state.h b/src/barebox-state/state.h
index 719f7e4..2d3ec41 100644
--- a/src/barebox-state/state.h
+++ b/src/barebox-state/state.h
@@ -118,8 +118,10 @@ struct state {
 
 	struct state_backend_format *format;
 	struct state_backend_storage storage;
-	char *backend_path;
-	char *backend_reproducible_name;
+	char *backend_dev_path;
+	char *backend_dts_dev_or_part;
+	char *backend_dts_partition;
+	bool backend_is_new_format;
 };
 
 enum state_convert {
diff --git a/src/dt/common.h b/src/dt/common.h
index 9b1c169..4cb0dc2 100644
--- a/src/dt/common.h
+++ b/src/dt/common.h
@@ -360,6 +360,23 @@ static inline int is_zero_ether_addr(const u8 *addr)
 	return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);
 }
 
+struct device_node;
+
+static inline int of_partition_ensure_probed(struct device_node *np)
+{
+	return 0;
+}
+
+static inline int of_device_ensure_probed(struct device_node *np)
+{
+	return 0;
+}
+
+static inline int is_of_partition(struct device_node *np)
+{
+	return 0;
+}
+
 #define MAX_DRIVER_NAME		32
 #define DEVICE_ID_SINGLE	-1
 
-- 
2.30.2




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

* Re: [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (13 preceding siblings ...)
  2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 14/14] state: sync with barebox to support new backend type Marco Felsch
@ 2022-10-21  7:37 ` Marco Felsch
  2023-06-05 13:12 ` Ahmad Fatoum
  15 siblings, 0 replies; 17+ messages in thread
From: Marco Felsch @ 2022-10-21  7:37 UTC (permalink / raw)
  To: oss-tools

Hi,

On 22-10-14, Marco Felsch wrote:
> Hi,
> 
> this series sync the dt-utils barebox-state code base with a very recent
> barebox version [1]. The most import patch are patch13-14, since those adding
> the user-space support for the backend format. By this new
> backend-format we are able to store the barebox-state on a on-disk
> partition like MBR/GPT.
> 
> [1] https://lore.barebox.org/barebox/20221014163534.3812272-1-m.felsch@pengutronix.de/T/#mb63a3ce9abdfc3091fff9d977e696232713fc247

As discussion showed, the approach of patches 13-14 will not make it
into mainline. Therefore please drop those. The rest can still be taken
since there is huge gap between barebox-code and this user-space code.

Regards,
  Marco



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

* Re: [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base
  2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
                   ` (14 preceding siblings ...)
  2022-10-21  7:37 ` [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
@ 2023-06-05 13:12 ` Ahmad Fatoum
  15 siblings, 0 replies; 17+ messages in thread
From: Ahmad Fatoum @ 2023-06-05 13:12 UTC (permalink / raw)
  To: Marco Felsch, oss-tools; +Cc: mfe

Hello Marco,

On 14.10.22 18:41, Marco Felsch wrote:
> Hi,
> 
> this series sync the dt-utils barebox-state code base with a very recent
> barebox version [1]. The most import patch are patch13-14, since those adding
> the user-space support for the backend format. By this new
> backend-format we are able to store the barebox-state on a on-disk
> partition like MBR/GPT.
> 
> [1] https://lore.barebox.org/barebox/20221014163534.3812272-1-m.felsch@pengutronix.de/T/#mb63a3ce9abdfc3091fff9d977e696232713fc247

I applied patches 1-12/14 to next. For the other two, I implemented an
alternative scheme that uses GPT Type UUIDs instead:

  https://lore.pengutronix.org/oss-tools/20230531152253.1407395-1-a.fatoum@pengutronix.de/T/#t
  https://lore.barebox.org/barebox/20230531145927.1399282-1-a.fatoum@pengutronix.de/T/#t

Thanks,
Ahmad

> 
> Regards,
>   Marco
> 
> Juergen Borleis (1):
>   libdt: add partition search function
> 
> Marco Felsch (13):
>   state: Remove duplicate incudes
>   state: backend_raw: fix ignoring unpack failures
>   state: backend_storage: deal gracefully with runtime bucket corruption
>   state: treat state with all-invalid buckets as dirty
>   state: remove param member from struct state_string
>   state: remove param member from state_uint32, state_enum32, state_mac
>   state: remove unused function
>   state: propagate failure to fixup enum32 into DT
>   state: add SPDX-License-Identifier for files without explicit license
>   state: fix typos found with codespell
>   common: xstrdup: don't panic on xstrdup(NULL)
>   libdt: add of_property_write_strings support
>   state: sync with barebox to support new backend type
> 
>  src/barebox-state/backend_format_raw.c |   6 +-
>  src/barebox-state/backend_storage.c    |   2 +
>  src/barebox-state/state.c              | 177 +++++++++++-----
>  src/barebox-state/state.h              |  12 +-
>  src/barebox-state/state_variables.c    |  38 ++--
>  src/dt/common.h                        |  23 ++-
>  src/dt/dt.h                            |   4 +
>  src/libdt-utils.sym                    |   2 +
>  src/libdt.c                            | 271 +++++++++++++++++++++++++
>  9 files changed, 452 insertions(+), 83 deletions(-)
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |




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

end of thread, other threads:[~2023-06-05 13:12 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-14 16:41 [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 01/14] state: Remove duplicate incudes Marco Felsch
2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 02/14] state: backend_raw: fix ignoring unpack failures Marco Felsch
2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 03/14] state: backend_storage: deal gracefully with runtime bucket corruption Marco Felsch
2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 04/14] state: treat state with all-invalid buckets as dirty Marco Felsch
2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 05/14] state: remove param member from struct state_string Marco Felsch
2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 06/14] state: remove param member from state_uint32, state_enum32, state_mac Marco Felsch
2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 07/14] state: remove unused function Marco Felsch
2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 08/14] state: propagate failure to fixup enum32 into DT Marco Felsch
2022-10-14 16:41 ` [OSS-Tools] [PATCH dt-utils 09/14] state: add SPDX-License-Identifier for files without explicit license Marco Felsch
2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 10/14] state: fix typos found with codespell Marco Felsch
2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 11/14] common: xstrdup: don't panic on xstrdup(NULL) Marco Felsch
2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 12/14] libdt: add of_property_write_strings support Marco Felsch
2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 13/14] libdt: add partition search function Marco Felsch
2022-10-14 16:42 ` [OSS-Tools] [PATCH dt-utils 14/14] state: sync with barebox to support new backend type Marco Felsch
2022-10-21  7:37 ` [OSS-Tools] [PATCH dt-utils 00/14] Sync Barebox-State code base Marco Felsch
2023-06-05 13:12 ` Ahmad Fatoum

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