fdt: prevent clearing memory node if there are no banks
authorAndre Przywara <osp@andrep.de>
Sat, 20 Jun 2015 23:29:54 +0000 (00:29 +0100)
committerSimon Glass <sjg@chromium.org>
Mon, 20 Jul 2015 13:21:47 +0000 (07:21 -0600)
Avoid clearing the reg property in the memory DT node if no memory
banks have been specified for a board (CONFIG_NR_DRAM_BANKS == 0).
This allows boards to let U-Boot skip the DT memory tinkering in case
other firmware has already setup the node properly before.
This should be safe as all callers of fdt_fixup_memory_banks that use
a computed <banks> value put at least 1 in there.
Add some documentation comments to the header file.

Signed-off-by: Andre Przywara <osp@andrep.de>
Acked-by: Simon Glass <sjg@chromium.org>
common/fdt_support.c
include/fdt_support.h

index 10648b5a4a86e0d94765b94b02af7b0e4ca9fc76..f86365e8f0da60caddb0444518e72bb8e46ea0b7 100644 (file)
@@ -454,6 +454,9 @@ int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)
                return err;
        }
 
+       if (!banks)
+               return 0;
+
        len = fdt_pack_reg(blob, tmp, start, size, banks);
 
        err = fdt_setprop(blob, nodeoffset, "reg", tmp, len);
index 0edc4fa5b1445e594368ebd6ac7c214687c9ef3d..296add01f34f9ece7f172b4a59c3cff9eb63d474 100644 (file)
@@ -67,8 +67,34 @@ void do_fixup_by_compat(void *fdt, const char *compat,
                        const char *prop, const void *val, int len, int create);
 void do_fixup_by_compat_u32(void *fdt, const char *compat,
                            const char *prop, u32 val, int create);
+/**
+ * Setup the memory node in the DT. Creates one if none was existing before.
+ * Calls fdt_fixup_memory_banks() to populate a single reg pair covering the
+ * whole memory.
+ *
+ * @param blob         FDT blob to update
+ * @param start                Begin of DRAM mapping in physical memory
+ * @param size         Size of the single memory bank
+ * @return 0 if ok, or -1 or -FDT_ERR_... on error
+ */
 int fdt_fixup_memory(void *blob, u64 start, u64 size);
+
+/**
+ * Fill the DT memory node with multiple memory banks.
+ * Creates the node if none was existing before.
+ * If banks is 0, it will not touch the existing reg property. This allows
+ * boards to not mess with the existing DT setup, which may have been
+ * filled in properly before.
+ *
+ * @param blob         FDT blob to update
+ * @param start                Array of size <banks> to hold the start addresses.
+ * @param size         Array of size <banks> to hold the size of each region.
+ * @param banks                Number of memory banks to create. If 0, the reg
+ *                     property will be left untouched.
+ * @return 0 if ok, or -1 or -FDT_ERR_... on error
+ */
 int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks);
+
 void fdt_fixup_ethernet(void *fdt);
 int fdt_find_and_setprop(void *fdt, const char *node, const char *prop,
                         const void *val, int len, int create);