board: stm32mp1: fix handling of DT OP-TEE reserved memory nodes
authorEtienne Carriere <etienne.carriere@linaro.org>
Fri, 5 Jun 2020 07:24:29 +0000 (09:24 +0200)
committerPatrick Delaunay <patrick.delaunay@st.com>
Tue, 16 Jun 2020 08:38:09 +0000 (10:38 +0200)
Fix the sequence in stm32mp1 fdt.c that disables OP-TEE resources
defined in FDT when U-boot detects OP-TEE firmware is not present.

Before this change, helper function stm32_fdt_disable_optee()
set property status to "disabled" for the OP-TEE reserved memory
nodes but this has no impact since Linux kernel does not consider
the status property for reserved-memory subnodes. This change
make U-Boot to attempt to delete the node instead.

Fixes: 4a1b975dac02 ("board: stm32mp1: reserve memory for OP-TEE in device tree")
Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org>
Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
Reviewed-by: Patrice Chotard <patrice.chotard@st.com>
arch/arm/mach-stm32mp/fdt.c

index c723b22..959f12e 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
 /*
- * Copyright (C) 2019, STMicroelectronics - All Rights Reserved
+ * Copyright (C) 2019-2020, STMicroelectronics - All Rights Reserved
  */
 
 #include <common.h>
@@ -224,19 +224,23 @@ static void stm32_fdt_disable_optee(void *blob)
 {
        int off, node;
 
+       /* Delete "optee" firmware node */
        off = fdt_node_offset_by_compatible(blob, -1, "linaro,optee-tz");
        if (off >= 0 && fdtdec_get_is_enabled(blob, off))
-               fdt_status_disabled(blob, off);
+               fdt_del_node(blob, off);
 
-       /* Disabled "optee@..." reserved-memory node */
+       /* Delete "optee@..." reserved-memory node */
        off = fdt_path_offset(blob, "/reserved-memory/");
        if (off < 0)
                return;
        for (node = fdt_first_subnode(blob, off);
             node >= 0;
             node = fdt_next_subnode(blob, node)) {
-               if (!strncmp(fdt_get_name(blob, node, NULL), "optee@", 6))
-                       fdt_status_disabled(blob, node);
+               if (strncmp(fdt_get_name(blob, node, NULL), "optee@", 6))
+                       continue;
+
+               if (fdt_del_node(blob, node))
+                       printf("Failed to remove optee reserved-memory node\n");
        }
 }