From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.2 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 989ACC433EF for ; Mon, 6 Sep 2021 00:30:31 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C952D60E73 for ; Mon, 6 Sep 2021 00:30:30 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org C952D60E73 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id CA35982D7C; Mon, 6 Sep 2021 02:30:28 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Received: by phobos.denx.de (Postfix, from userid 109) id CC71682D7C; Mon, 6 Sep 2021 02:30:26 +0200 (CEST) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by phobos.denx.de (Postfix) with ESMTP id D3E6E81FA5 for ; Mon, 6 Sep 2021 02:30:22 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=andre.przywara@arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 22F7D1FB; Sun, 5 Sep 2021 17:30:22 -0700 (PDT) Received: from slackpad.fritz.box (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id A706A3F73D; Sun, 5 Sep 2021 17:30:18 -0700 (PDT) Date: Mon, 6 Sep 2021 01:30:03 +0100 From: Andre Przywara To: Samuel Holland Cc: u-boot@lists.denx.de, Jagan Teki , AKASHI Takahiro , Alexandru Gagniuc , Baruch Siach , Bharat Gooty , Chris Packham , Fabio Estevam , Frieder Schrempf , Jernej Skrabec , Marek =?UTF-8?B?QmVow7pu?= , "NXP i.MX U-Boot Team" , Naoki Hayama , Pali =?UTF-8?B?Um9ow6Fy?= , Patrick Delaunay , Priyanka Jain , Rayagonda Kokatanur , Simon Glass , Stefan Roese , Stefano Babic , Sughosh Ganu , Trevor Woerner , lauri.hintsala@silabs.com Subject: Re: [PATCH v2 3/4] sunxi: Support SPL in both eGON and TOC0 images Message-ID: <20210906013003.1ddeb87f@slackpad.fritz.box> In-Reply-To: <20210822044649.13585-4-samuel@sholland.org> References: <20210822044649.13585-1-samuel@sholland.org> <20210822044649.13585-4-samuel@sholland.org> Organization: Arm Ltd. X-Mailer: Claws Mail 3.17.1 (GTK+ 2.24.31; x86_64-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean On Sat, 21 Aug 2021 23:46:47 -0500 Samuel Holland wrote: Hi, > SPL uses the image header to detect the boot device and to find the > offset of the next U-Boot stage. Since this information is stored > differently in the eGON and TOC0 image headers, add code to find the > correct value based on the image type currently in use. many thanks for determining this at runtime! > Signed-off-by: Samuel Holland > --- > > Changes in v2: > - Moved SPL header signature checks out of sunxi_image.h > - Refactored SPL header signature checks to use fewer casts > > arch/arm/include/asm/arch-sunxi/spl.h | 2 -- > arch/arm/mach-sunxi/board.c | 50 +++++++++++++++++++++++---- > 2 files changed, 43 insertions(+), 9 deletions(-) > > diff --git a/arch/arm/include/asm/arch-sunxi/spl.h b/arch/arm/include/asm/arch-sunxi/spl.h > index 58cdf806d9a..157b11e4897 100644 > --- a/arch/arm/include/asm/arch-sunxi/spl.h > +++ b/arch/arm/include/asm/arch-sunxi/spl.h > @@ -19,8 +19,6 @@ > #define SUNXI_BOOTED_FROM_MMC0_HIGH 0x10 > #define SUNXI_BOOTED_FROM_MMC2_HIGH 0x12 > > -#define is_boot0_magic(addr) (memcmp((void *)(addr), BOOT0_MAGIC, 8) == 0) > - > uint32_t sunxi_get_boot_device(void); > > #endif > diff --git a/arch/arm/mach-sunxi/board.c b/arch/arm/mach-sunxi/board.c > index d9b04f75fc4..b6f92bdc5e7 100644 > --- a/arch/arm/mach-sunxi/board.c > +++ b/arch/arm/mach-sunxi/board.c > @@ -244,12 +244,40 @@ void s_init(void) > > #define SUNXI_INVALID_BOOT_SOURCE -1 > > -static int sunxi_get_boot_source(void) > +static struct boot_file_head *sunxi_egon_get_head(void) > { > - if (!is_boot0_magic(SPL_ADDR + 4)) /* eGON.BT0 */ > - return SUNXI_INVALID_BOOT_SOURCE; > + struct boot_file_head *egon_head = (void *)SPL_ADDR; > + > + if (memcmp(egon_head, BOOT0_MAGIC, 8)) /* eGON.BT0 */ For eGON the magic is not at the beginning of the struct, so you need: memcmp(&egon_head->magic, BOOT0_MAGIC, 8) Otherwise 99.9% of all Allwinner users will be very disappointed ;-) And there is another problem: For 32-bit SoCs the SPL address is literally 0 (SRAM A1), so the return value in the successful case is NULL as well :-( Maybe have a function to return an enum (EGON, TOC0, NONE/FEL) instead? After all the address will always be SPL_ADDR. Cheers, Andre > + return NULL; > + > + return egon_head; > +} > + > +static struct toc0_main_info *sunxi_toc0_get_info(void) > +{ > + struct toc0_main_info *toc0_info = (void *)SPL_ADDR; > + > + if (memcmp(toc0_info->name, TOC0_MAIN_INFO_NAME, 8)) /* TOC0.GLH */ > + return NULL; > > - return readb(SPL_ADDR + 0x28); > + return toc0_info; > +} > + > +static int sunxi_get_boot_source(void) > +{ > + struct boot_file_head *egon_head; > + struct toc0_main_info *toc0_info; > + > + egon_head = sunxi_egon_get_head(); > + if (egon_head) > + return readb(&egon_head->boot_media); > + toc0_info = sunxi_toc0_get_info(); > + if (toc0_info) > + return readb(&toc0_info->platform[0]); > + > + /* Not a valid image, so we must have been booted via FEL. */ > + return SUNXI_INVALID_BOOT_SOURCE; > } > > /* The sunxi internal brom will try to loader external bootloader > @@ -297,10 +325,18 @@ uint32_t sunxi_get_boot_device(void) > #ifdef CONFIG_SPL_BUILD > static u32 sunxi_get_spl_size(void) > { > - if (!is_boot0_magic(SPL_ADDR + 4)) /* eGON.BT0 */ > - return 0; > + struct boot_file_head *egon_head; > + struct toc0_main_info *toc0_info; > + > + egon_head = sunxi_egon_get_head(); > + if (egon_head) > + return readl(&egon_head->length); > + toc0_info = sunxi_toc0_get_info(); > + if (toc0_info) > + return readl(&toc0_info->length); > > - return readl(SPL_ADDR + 0x10); > + /* Not a valid image, so use the default U-Boot offset. */ > + return 0; > } > > /*