From patchwork Wed Mar 1 02:25:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 734014 X-Patchwork-Delegate: jagannadh.teki@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3vY00z0lqkz9s83 for ; Wed, 1 Mar 2017 13:35:31 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id BF892C21F2F; Wed, 1 Mar 2017 02:28:23 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id BB91AC21D86; Wed, 1 Mar 2017 02:27:00 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 4F6C8C21CFB; Wed, 1 Mar 2017 02:26:20 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.101.70]) by lists.denx.de (Postfix) with ESMTP id CDDEFC21C9E for ; Wed, 1 Mar 2017 02:26:16 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 32A8528; Tue, 28 Feb 2017 18:26:16 -0800 (PST) Received: from slackpad.lan (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 7824C3F3E1; Tue, 28 Feb 2017 18:26:13 -0800 (PST) From: Andre Przywara To: Maxime Ripard , Jagan Teki , Simon Glass , Tom Rini Date: Wed, 1 Mar 2017 02:25:17 +0000 Message-Id: <1488335129-12363-6-git-send-email-andre.przywara@arm.com> X-Mailer: git-send-email 2.8.2 In-Reply-To: <1488335129-12363-1-git-send-email-andre.przywara@arm.com> References: <1488335129-12363-1-git-send-email-andre.przywara@arm.com> Cc: Philipp Tomsich , linux-sunxi@googlegroups.com, Michal Simek , u-boot@lists.denx.de Subject: [U-Boot] [PATCH 05/17] SPL: FIT: allow loading multiple images X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 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" So far we were not using the FIT image format to its full potential: The SPL FIT loader was just loading the first image from the /images node plus one of the listed DTBs. Now with the refactored loader code it's easy to load an arbitrary number of images in addition to the two mentioned above. As described in the FIT image source file format description, iterate over all images listed at the "loadables" property in the configuration node and load every image at its desired location. This allows to load any kind of images: - firmware images to execute before U-Boot proper (for instance ARM Trusted Firmware (ATF)) - firmware images for management processors (SCP, arisc, ...) - firmware images for devices like WiFi controllers - bit files for FPGAs - additional configuration data - kernels and/or ramdisks The actual usage of this feature would be platform and/or board specific. Signed-off-by: Andre Przywara Reviewed-by: Lokesh Vutla --- common/spl/spl_fit.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index ad5ba15..5583e09 100644 --- a/common/spl/spl_fit.c +++ b/common/spl/spl_fit.c @@ -178,10 +178,7 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector, if (image_info) { image_info->load_addr = load_addr; image_info->size = length; - if (entry == -1UL) - image_info->entry_point = load_addr; - else - image_info->entry_point = entry; + image_info->entry_point = entry; } return 0; @@ -196,6 +193,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, struct spl_image_info image_info; int node, images; int base_offset, align_len = ARCH_DMA_MINALIGN - 1; + int index = 0; /* * Figure out where the external images start. This is the base for the @@ -240,6 +238,11 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, if (node < 0) { debug("could not find firmware image, trying loadables...\n"); node = spl_fit_get_image_node(fit, images, "loadables", 0); + /* + * If we pick the U-Boot image from "loadables", start at + * the second image when later loading additional images. + */ + index = 1; } if (node < 0) { debug("%s: Cannot find u-boot image node: %d\n", @@ -265,5 +268,26 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, image_info.load_addr = spl_image->load_addr + spl_image->size; spl_load_fit_image(info, sector, fit, base_offset, node, &image_info); + /* Now check if there are more images for us to load */ + for (; ; index++) { + node = spl_fit_get_image_node(fit, images, "loadables", index); + if (node < 0) + break; + + spl_load_fit_image(info, sector, fit, base_offset, node, + &image_info); + + /* + * If the "firmware" image did not provide an entry point, + * use the first valid entry point from the loadables. + */ + if (spl_image->entry_point == -1UL && + image_info.entry_point != -1UL) + spl_image->entry_point = image_info.entry_point; + } + + if (spl_image->entry_point == -1UL || spl_image->entry_point == 0) + spl_image->entry_point = spl_image->load_addr; + return 0; }