Hi Patrick, On Thu, 8 Jun 2023 at 16:16, Patrick Delaunay <patrick.delau...@foss.st.com> wrote: > > 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.delau...@foss.st.com> > --- > > common/fdt_support.c | 73 +++++++++++++++++++++++++++++++++++++++++++ > include/fdt_support.h | 8 +++++ > 2 files changed, 81 insertions(+) > > diff --git a/common/fdt_support.c b/common/fdt_support.c > index ffc59fd8b36a..5e49078f8c35 100644 > --- a/common/fdt_support.c > +++ b/common/fdt_support.c > @@ -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;
It should be possible to use livetree to write to the blob. E.g.: oftree tree = oftree_from_fdt(blob); ofnode node = oftree_path(tree, "/..."); That would be more future-proof than using this API. I'd like to move DT fixup to the ofnode API eventually. > + > + 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); > diff --git a/include/fdt_support.h b/include/fdt_support.h > index eeb83e6251d3..2cd836689821 100644 > --- a/include/fdt_support.h > +++ b/include/fdt_support.h > @@ -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); > > /** > -- > 2.25.1 > Regards, Simon