On some platforms (e.g. EFI on x86_64) the state backend can only be
selected by a partiton UUID. On existing devices with a DOS partition
table, there may be no spare partition available for state.

This makes it possible to select the disk via UUID. The exact position is
defined by an explicitly specified offset.

The same patch was submittet to barebox:
https://lore.barebox.org/barebox/20220124100458.2924679-4-m.olbr...@pengutronix.de/

Signed-off-by: Michael Olbrich <m.olbr...@pengutronix.de>
---
 src/barebox-state/state.c | 55 ++++++++++++++++++++++++++-------------
 1 file changed, 37 insertions(+), 18 deletions(-)

diff --git a/src/barebox-state/state.c b/src/barebox-state/state.c
index 363ac8a5d485..f825ee6f1303 100644
--- a/src/barebox-state/state.c
+++ b/src/barebox-state/state.c
@@ -593,6 +593,7 @@ struct state *state_new_from_node(struct device_node *node, 
bool readonly)
        const char *backend_type;
        const char *storage_type = NULL;
        const char *alias;
+       const char *diskuuid;
        uint32_t stridesize;
        struct device_node *partition_node;
        off_t offset = 0;
@@ -608,30 +609,48 @@ 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;
-       }
+       ret = of_property_read_string(node, "backend-diskuuid", &diskuuid);
+       if (ret == 0) {
+               u64 off;
+
+               ret = devpath_from_diskuuid(diskuuid, &state->backend_path);
+               if (ret) {
+                       dev_err(&state->dev, "state failed find backend device 
for diskuuid='%s'\n",
+                               diskuuid);
+                       goto out_release_state;
+               }
+               ret = of_property_read_u64(node, "backend-offset", &off);
+               if (ret) {
+                       dev_err(&state->dev, "'backend-offset' property 
undefined\n");
+                       goto out_release_state;
+               }
+               offset = off;
+       } else {
+               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_partition_ensure_probed(partition_node);
-       if (ret)
-               goto out_release_state;
+               ret = of_partition_ensure_probed(partition_node);
+               if (ret)
+                       goto out_release_state;
 
-       ret = of_find_path_by_node(partition_node, &state->backend_path, 0);
+               ret = of_find_path_by_node(partition_node, 
&state->backend_path, 0);
 #else
-       ret = of_get_devicepath(partition_node, &state->backend_path, &offset, 
&size);
+               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));
-               goto out_release_state;
-       }
+               if (ret) {
+                       if (ret != -EPROBE_DEFER)
+                               dev_err(&state->dev, "state failed to parse 
path to backend: %s\n",
+                                      strerror(-ret));
+                       goto out_release_state;
+               }
 
-       state->backend_reproducible_name = 
of_get_reproducible_name(partition_node);
+               state->backend_reproducible_name = 
of_get_reproducible_name(partition_node);
+       }
 
        ret = of_property_read_string(node, "backend-type", &backend_type);
        if (ret) {
-- 
2.30.2


_______________________________________________
OSS-Tools mailing list
OSS-Tools@pengutronix.de

Reply via email to