From 5c1cf89f8c342c8533f730409f7dd2b21806c3d3 Mon Sep 17 00:00:00 2001 From: Andre Przywara Date: Sun, 21 Jun 2015 00:29:54 +0100 Subject: [PATCH] fdt: prevent clearing memory node if there are no banks 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 value put at least 1 in there. Add some documentation comments to the header file. Signed-off-by: Andre Przywara Acked-by: Simon Glass --- common/fdt_support.c | 3 +++ include/fdt_support.h | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/common/fdt_support.c b/common/fdt_support.c index 10648b5a4a..f86365e8f0 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -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); diff --git a/include/fdt_support.h b/include/fdt_support.h index 0edc4fa5b1..296add01f3 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -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 to hold the start addresses. + * @param size Array of size 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); -- 2.39.5