From patchwork Wed Jun 19 10:57:51 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Dooks X-Patchwork-Id: 2748541 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id EA61BC0AB1 for ; Wed, 19 Jun 2013 10:59:33 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id CCD8D20354 for ; Wed, 19 Jun 2013 10:59:32 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 607B720342 for ; Wed, 19 Jun 2013 10:59:31 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UpG6Q-0004sq-3S; Wed, 19 Jun 2013 10:59:02 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1UpG6I-0007c7-KT; Wed, 19 Jun 2013 10:58:54 +0000 Received: from ducie-dc1.codethink.co.uk ([37.128.190.40]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UpG6A-0007aE-UM for linux-arm-kernel@lists.infradead.org; Wed, 19 Jun 2013 10:58:48 +0000 Received: by ducie-dc1.codethink.co.uk (Postfix, from userid 1002) id CF138462D67; Wed, 19 Jun 2013 11:58:17 +0100 (BST) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-5.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from rainbowdash.ducie.codethink.co.uk (rainbowdash.dyn.ducie.codethink.co.uk [192.168.24.134]) by ducie-dc1.codethink.co.uk (Postfix) with ESMTPS id 2252E462D67; Wed, 19 Jun 2013 11:58:01 +0100 (BST) Received: from ben by rainbowdash.ducie.codethink.co.uk with local (Exim 4.80) (envelope-from ) id 1UpG5M-0003gs-Gx; Wed, 19 Jun 2013 11:57:56 +0100 From: Ben Dooks To: linux-arm-kernel@lists.infradead.org Subject: [PATCH] atags_to_fdt: take into account root's #size and #cells Date: Wed, 19 Jun 2013 11:57:51 +0100 Message-Id: <1371639471-14144-2-git-send-email-ben.dooks@codethink.co.uk> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1371639471-14144-1-git-send-email-ben.dooks@codethink.co.uk> References: <1371639471-14144-1-git-send-email-ben.dooks@codethink.co.uk> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130619_065847_192353_88765B90 X-CRM114-Status: GOOD ( 16.40 ) X-Spam-Score: -3.2 (---) Cc: Ben Dooks , rob.taylor@codethink.co.uk X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP When creating entries for /memory, the root #size and #cells must be taken into account otherwise the node will not be recongnized when the OF code scans the nodes. On some systems, the default is now to be 2 for each of #size and #cells which means that appending a kernrel and having it update from ATAGS does not work properly. --- arch/arm/boot/compressed/atags_to_fdt.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/compressed/atags_to_fdt.c b/arch/arm/boot/compressed/atags_to_fdt.c index 74e193e..da36840 100644 --- a/arch/arm/boot/compressed/atags_to_fdt.c +++ b/arch/arm/boot/compressed/atags_to_fdt.c @@ -1,5 +1,6 @@ #include #include +#include #if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND) #define do_extend_cmdline 1 @@ -95,9 +96,12 @@ static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) int atags_to_fdt(void *atag_list, void *fdt, int total_space) { struct tag *atag = atag_list; - uint32_t mem_reg_property[2 * NR_BANKS]; + uint32_t mem_reg_property[2 * 2 * NR_BANKS]; + const __be32 *prop; int memcount = 0; int ret; + u32 dt_root_size_cells; + u32 dt_root_addr_cells; /* make sure we've got an aligned pointer */ if ((u32)atag_list & 0x3) @@ -118,6 +122,17 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space) if (ret < 0) return ret; + dt_root_size_cells = OF_ROOT_NODE_SIZE_CELLS_DEFAULT; + dt_root_addr_cells = OF_ROOT_NODE_ADDR_CELLS_DEFAULT; + + prop = getprop(fdt, "/", "#size-cells", NULL); + if (prop) + dt_root_size_cells = be32_to_cpup(prop); + + prop = getprop(fdt, "/", "#address-cells", NULL); + if (prop) + dt_root_addr_cells = be32_to_cpup(prop); + for_each_tag(atag, atag_list) { if (atag->hdr.tag == cpu_to_atag32(ATAG_CMDLINE)) { /* Append the ATAGS command line to the device tree @@ -137,7 +152,12 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space) continue; if (!atag32_to_cpu(atag->u.mem.size)) continue; + + for (ret = 0; ret < dt_root_addr_cells - 1; ret++) + mem_reg_property[memcount++] = cpu_to_fdt32(0); mem_reg_property[memcount++] = cpu_to_fdt32(atag32_to_cpu(atag->u.mem.start)); + for (ret = 0; ret < dt_root_size_cells - 1; ret++) + mem_reg_property[memcount++] = cpu_to_fdt32(0); mem_reg_property[memcount++] = cpu_to_fdt32(atag32_to_cpu(atag->u.mem.size)); } else if (atag->hdr.tag == cpu_to_atag32(ATAG_INITRD2)) { uint32_t initrd_start, initrd_size;