]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
fdt_support: add fdt_copy_fixed_partitions function
authorPatrick Delaunay <patrick.delaunay@foss.st.com>
Thu, 8 Jun 2023 15:16:38 +0000 (17:16 +0200)
committerPatrice Chotard <patrice.chotard@foss.st.com>
Fri, 16 Jun 2023 09:01:15 +0000 (11:01 +0200)
Add a new function fdt_copy_fixed_partitions to copy the fixed
partition nodes from U-Boot device tree to Linux kernel
device tree and to dynamically configure the MTD partitions.

This function fdt_copy_fixed_partitions is only based on device tree
with livetree compatible function and replace the function
fdt_fixup_mtdparts based on mtdparts variable.

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
common/fdt_support.c
include/fdt_support.h

index ffc59fd8b36a0940fbbf67d1a7e6ee848378f884..5e49078f8c35870a2b405353446e75a9a95cec78 100644 (file)
@@ -1051,6 +1051,79 @@ void fdt_fixup_mtdparts(void *blob, const struct node_info *node_info,
 }
 #endif
 
+int fdt_copy_fixed_partitions(void *blob)
+{
+       ofnode node, subnode;
+       int off, suboff, res;
+       char path[256];
+       int address_cells, size_cells;
+       u8 i, j, child_count;
+
+       node = ofnode_by_compatible(ofnode_null(), "fixed-partitions");
+       while (ofnode_valid(node)) {
+               /* copy the U-Boot fixed partition */
+               address_cells = ofnode_read_simple_addr_cells(node);
+               size_cells = ofnode_read_simple_size_cells(node);
+
+               res = ofnode_get_path(ofnode_get_parent(node), path, sizeof(path));
+               if (res)
+                       return res;
+
+               off = fdt_path_offset(blob, path);
+               if (off < 0)
+                       return -ENODEV;
+
+               off = fdt_find_or_add_subnode(blob, off, "partitions");
+               res = fdt_setprop_string(blob, off, "compatible", "fixed-partitions");
+               if (res)
+                       return res;
+
+               res = fdt_setprop_u32(blob, off, "#address-cells", address_cells);
+               if (res)
+                       return res;
+
+               res = fdt_setprop_u32(blob, off, "#size-cells", size_cells);
+               if (res)
+                       return res;
+
+               /*
+                * parse partition in reverse order as fdt_find_or_add_subnode() only
+                * insert the new node after the parent's properties
+                */
+               child_count = ofnode_get_child_count(node);
+               for (i = child_count; i > 0 ; i--) {
+                       subnode = ofnode_first_subnode(node);
+                       if (!ofnode_valid(subnode))
+                               break;
+
+                       for (j = 0; (j < i - 1); j++)
+                               subnode = ofnode_next_subnode(subnode);
+
+                       if (!ofnode_valid(subnode))
+                               break;
+
+                       const u32 *reg;
+                       int len;
+
+                       suboff = fdt_find_or_add_subnode(blob, off, ofnode_get_name(subnode));
+                       res = fdt_setprop_string(blob, suboff, "label",
+                                                ofnode_read_string(subnode, "label"));
+                       if (res)
+                               return res;
+
+                       reg = ofnode_get_property(subnode, "reg", &len);
+                       res = fdt_setprop(blob, suboff, "reg", reg, len);
+                       if (res)
+                               return res;
+               }
+
+               /* go to next fixed-partitions node */
+               node = ofnode_by_compatible(node, "fixed-partitions");
+       }
+
+       return 0;
+}
+
 void fdt_del_node_and_alias(void *blob, const char *alias)
 {
        int off = fdt_path_offset(blob, alias);
index eeb83e6251d355785d5367796605cfd0bc168b26..2cd836689821df8135c6df3253a839bdda0724a7 100644 (file)
@@ -256,6 +256,14 @@ static inline void fdt_fixup_mtdparts(void *fdt,
 }
 #endif
 
+/**
+ * copy the fixed-partition nodes from U-Boot device tree to external blob
+ *
+ * @param blob         FDT blob to update
+ * Return: 0 if ok, or non-zero on error
+ */
+int fdt_copy_fixed_partitions(void *blob);
+
 void fdt_del_node_and_alias(void *blob, const char *alias);
 
 /**