From patchwork Sat Jun 13 10:43:13 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 483838 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 418651401DA for ; Sat, 13 Jun 2015 20:47:07 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 77B804B61D; Sat, 13 Jun 2015 12:47:03 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id wO98VBnEHmOQ; Sat, 13 Jun 2015 12:47:03 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id EF26E4B615; Sat, 13 Jun 2015 12:47:02 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 1FEFD4B615 for ; Sat, 13 Jun 2015 12:47:01 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id qifMOI_SuKjR for ; Sat, 13 Jun 2015 12:47:01 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail.andrep.de (mail.andrep.de [217.160.17.100]) by theia.denx.de (Postfix) with ESMTP id E80574A039 for ; Sat, 13 Jun 2015 12:46:56 +0200 (CEST) Received: from slackpad.lan (host-92-24-180-103.ppp.as43234.net [92.24.180.103]) by mail.andrep.de (Postfix) with ESMTPSA id A4ACB1E480205; Sat, 13 Jun 2015 12:46:55 +0200 (CEST) From: Andre Przywara To: albert.u.boot@aribaud.net, trini@ti.com, Simon Glass Date: Sat, 13 Jun 2015 11:43:13 +0100 Message-Id: <1434192193-32126-1-git-send-email-osp@andrep.de> X-Mailer: git-send-email 1.8.4 In-Reply-To: References: Cc: u-boot@lists.denx.de, Mark Langsdorf , Rob Herring Subject: [U-Boot] [PATCH] fdt: prevent clearing memory node if there are no banks X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" 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 --- Hi, this replaces my former "6/8: ARM: bootm: allow skipping fdt memory node fixup" patch, as Simon had some (justified) concerns. If this is too generic now, let me know and I will rework it. Cheers, Andre. common/fdt_support.c | 14 ++++++++------ include/fdt_support.h | 26 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/common/fdt_support.c b/common/fdt_support.c index 9e50148..6ad532c 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -429,13 +429,15 @@ int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks) return err; } - len = fdt_pack_reg(blob, tmp, start, size, banks); + if (banks) { + len = fdt_pack_reg(blob, tmp, start, size, banks); - err = fdt_setprop(blob, nodeoffset, "reg", tmp, len); - if (err < 0) { - printf("WARNING: could not set %s %s.\n", - "reg", fdt_strerror(err)); - return err; + err = fdt_setprop(blob, nodeoffset, "reg", tmp, len); + if (err < 0) { + printf("WARNING: could not set %s %s.\n", + "reg", fdt_strerror(err)); + return err; + } } return 0; } diff --git a/include/fdt_support.h b/include/fdt_support.h index 5d4f28d..0296ed3 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -40,8 +40,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);