Message ID | 20200605092205.1.Ibab98d647c5748ec387b62823fa04035ac0afd74@changeid |
---|---|
State | New |
Headers | show |
Series | optee: fix copy of optee reserved-memory node | expand |
Hi Tom, > From: Patrick DELAUNAY <patrick.delaunay at st.com> > Sent: vendredi 5 juin 2020 09:22 > > From: Etienne Carriere <etienne.carriere at linaro.org> > > Fix the loop that parses FDT for a reserved memory node named "optee". > > Before this change, if at least one subnode was found in the reserved-memory > node, the function endlessly looped since instruction continue returned back in the > loop without updating variable subnode. > This change fixes the issue by using a for loop. > > Fixes: 6ccb05eae01b ("image: fdt: copy possible optee nodes to a loaded > devicetree") > Signed-off-by: Etienne Carriere <etienne.carriere at linaro.org> > Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com> > --- > > lib/optee/optee.c | 7 +++---- > 1 file changed, 3 insertions(+), 4 deletions(-) > > diff --git a/lib/optee/optee.c b/lib/optee/optee.c index e59b5766e7..457d4cca8a > 100644 > --- a/lib/optee/optee.c > +++ b/lib/optee/optee.c > @@ -156,8 +156,9 @@ int optee_copy_fdt_nodes(const void *old_blob, void > *new_blob) > /* optee inserts its memory regions as reserved-memory nodes */ > nodeoffset = fdt_subnode_offset(old_blob, 0, "reserved-memory"); > if (nodeoffset >= 0) { > - subnode = fdt_first_subnode(old_blob, nodeoffset); > - while (subnode >= 0) { > + for (subnode = fdt_first_subnode(old_blob, nodeoffset); > + subnode >= 0; > + subnode = fdt_next_subnode(old_blob, subnode)) { > const char *name = fdt_get_name(old_blob, > subnode, NULL); > if (!name) > @@ -197,8 +198,6 @@ int optee_copy_fdt_nodes(const void *old_blob, void > *new_blob) > if (ret < 0) > return ret; > } > - > - subnode = fdt_next_subnode(old_blob, subnode); > } > } > > -- > 2.17.1 Do you think it is possible to include this fix in v2020.07 ? Or do you expect some review ? This issue blocks the STM32MP1 boot with OP-TEE... as subnode is not update if the first reserved node is not "optee" one, with: if (strncmp(name, "optee", 5)) continue; for example DT = reserved-memory { gpu_reserved: gpu at da000000 { reg = <0xda000000 0x4000000>; no-map; }; optee at de000000 { reg = <0xde000000 0x02000000>; no-map; }; }; See also http://patchwork.ozlabs.org/project/uboot/list/?series=181471 Regards Patrick
On Fri, Jun 05, 2020 at 09:22:11AM +0200, Patrick Delaunay wrote: > From: Etienne Carriere <etienne.carriere at linaro.org> > > Fix the loop that parses FDT for a reserved memory node named "optee". > > Before this change, if at least one subnode was found in the > reserved-memory node, the function endlessly looped since instruction > continue returned back in the loop without updating variable subnode. > This change fixes the issue by using a for loop. > > Fixes: 6ccb05eae01b ("image: fdt: copy possible optee nodes to a loaded devicetree") > Signed-off-by: Etienne Carriere <etienne.carriere at linaro.org> > Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com> Applied to u-boot/master, thanks!
diff --git a/lib/optee/optee.c b/lib/optee/optee.c index e59b5766e7..457d4cca8a 100644 --- a/lib/optee/optee.c +++ b/lib/optee/optee.c @@ -156,8 +156,9 @@ int optee_copy_fdt_nodes(const void *old_blob, void *new_blob) /* optee inserts its memory regions as reserved-memory nodes */ nodeoffset = fdt_subnode_offset(old_blob, 0, "reserved-memory"); if (nodeoffset >= 0) { - subnode = fdt_first_subnode(old_blob, nodeoffset); - while (subnode >= 0) { + for (subnode = fdt_first_subnode(old_blob, nodeoffset); + subnode >= 0; + subnode = fdt_next_subnode(old_blob, subnode)) { const char *name = fdt_get_name(old_blob, subnode, NULL); if (!name) @@ -197,8 +198,6 @@ int optee_copy_fdt_nodes(const void *old_blob, void *new_blob) if (ret < 0) return ret; } - - subnode = fdt_next_subnode(old_blob, subnode); } }