From: Hans de Goede <hdegoede@redhat.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 3/4] sunxi: retrieve FEL-provided values to environment variables
Date: Thu, 17 Sep 2015 17:28:47 -0400 [thread overview]
Message-ID: <55FB308F.9090505@redhat.com> (raw)
In-Reply-To: <1442508773-29993-4-git-send-email-bernhard.nortmann@web.de>
Hi,
On 09/17/2015 12:52 PM, Bernhard Nortmann wrote:
> This patch extends the misc_init_r() function on sunxi boards
> to test for the presence of a suitable "sunxi" SPL header. If
> found, and the loader ("fel" utility) provided a non-zero value
> for the boot.scr address, then the corresponding environment
> variable fel_scriptaddr gets set.
>
> misc_init_r() also sets (or clears) the "fel_booted" variable depending
> on the active boot device, using the same logic as spl_boot_device().
>
> The goal is to provide sufficient information (within the U-Boot
> environment) to make intelligent decisions on how to continue the boot
> process, allowing specific customizations for the "FEL boot" case.
>
> Signed-off-by: Bernhard Nortmann <bernhard.nortmann@web.de>
> ---
>
> Changes in v3:
> - make use of asm/arch/spl.h to share definitions / helper macro
> - revert SPL version check to expect exact SPL_HEADER_VERSION
>
> Changes in v2:
> - renamed fel_data_addr to fel_script_addr, discarded fel_data_size
> - make sure that FEL-related environment vars are always cleared first
> - support minimum and maximum SPL (header) version, more verbose error messages
>
> arch/arm/cpu/armv7/sunxi/board.c | 2 +-
> arch/arm/include/asm/arch-sunxi/spl.h | 5 +++++
> arch/arm/include/asm/spl.h | 5 +++++
> board/sunxi/board.c | 35 +++++++++++++++++++++++++++++++++++
> 4 files changed, 46 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/cpu/armv7/sunxi/board.c b/arch/arm/cpu/armv7/sunxi/board.c
> index b40198b..0d68d20 100644
> --- a/arch/arm/cpu/armv7/sunxi/board.c
> +++ b/arch/arm/cpu/armv7/sunxi/board.c
> @@ -152,7 +152,7 @@ u32 spl_boot_device(void)
> * binary over USB. If it is found, it determines where SPL was
> * read from.
> */
> - if (readl(4) != 0x4E4F4765 || readl(8) != 0x3054422E) /* eGON.BT0 */
> + if (!is_boot0_magic(SPL_ADDR + 4)) /* eGON.BT0 */
> return BOOT_DEVICE_BOARD;
>
> /* The BROM will try to boot from mmc0 first, so try that first. */
> diff --git a/arch/arm/include/asm/arch-sunxi/spl.h b/arch/arm/include/asm/arch-sunxi/spl.h
> index 08fe32d..8abf79a 100644
> --- a/arch/arm/include/asm/arch-sunxi/spl.h
> +++ b/arch/arm/include/asm/arch-sunxi/spl.h
> @@ -13,6 +13,9 @@
> #define SPL_SIGNATURE "SPL" /* marks "sunxi" SPL header */
> #define SPL_HEADER_VERSION 1
>
> +/* Note: A80 will require special handling here: SPL_ADDR 0x10000 */
> +#define SPL_ADDR 0x0
> +
> /* boot head definition from sun4i boot code */
> struct boot_file_head {
> uint32_t b_instruction; /* one intruction jumping to real code */
> @@ -43,4 +46,6 @@ struct boot_file_head {
> uint32_t reserved; /* padding, align to 32 bytes */
> };
>
> +#define is_boot0_magic(addr) (memcmp((void *)addr, BOOT0_MAGIC, 8) == 0)
> +
> #endif
> diff --git a/arch/arm/include/asm/spl.h b/arch/arm/include/asm/spl.h
> index 6db405d..6587732 100644
> --- a/arch/arm/include/asm/spl.h
> +++ b/arch/arm/include/asm/spl.h
> @@ -7,6 +7,11 @@
> #ifndef _ASM_SPL_H_
> #define _ASM_SPL_H_
>
> +#if defined(CONFIG_SUNXI)
> +/* sunxi platform-specific additions */
> +#include <asm/arch/spl.h>
> +#endif
> +
> #if defined(CONFIG_OMAP) \
> || defined(CONFIG_EXYNOS4) || defined(CONFIG_EXYNOS5) \
> || defined(CONFIG_EXYNOS4210)
There is no need to pollute a non sunxi header this way, we can simply
do "#include <asm/arch/spl.h>" where needed.
No need to resend I've fixed this up in my tree.
Regards,
Hans
> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> index 9c855f6..096d127 100644
> --- a/board/sunxi/board.c
> +++ b/board/sunxi/board.c
> @@ -516,6 +516,31 @@ void get_board_serial(struct tag_serialnr *serialnr)
> }
> #endif
>
> +#if !defined(CONFIG_SPL_BUILD)
> +#include <asm/arch/spl.h>
> +
> +/*
> + * Check the SPL header for the "sunxi" variant. If found: parse values
> + * that might have been passed by the loader ("fel" utility), and update
> + * the environment accordingly.
> + */
> +static void parse_spl_header(const uint32_t spl_addr)
> +{
> + struct boot_file_head *spl = (void *)spl_addr;
> + if (memcmp(spl->spl_signature, SPL_SIGNATURE, 3) == 0) {
> + uint8_t spl_header_version = spl->spl_signature[3];
> + if (spl_header_version == SPL_HEADER_VERSION) {
> + if (spl->fel_script_address)
> + setenv_hex("fel_scriptaddr",
> + spl->fel_script_address);
> + return;
> + }
> + printf("sunxi SPL version mismatch: expected %u, got %u\n",
> + SPL_HEADER_VERSION, spl_header_version);
> + }
> +}
> +#endif
> +
> #ifdef CONFIG_MISC_INIT_R
> int misc_init_r(void)
> {
> @@ -524,6 +549,16 @@ int misc_init_r(void)
> uint8_t mac_addr[6];
> int ret;
>
> +#if !defined(CONFIG_SPL_BUILD)
> + setenv("fel_booted", NULL);
> + setenv("fel_scriptaddr", NULL);
> + /* determine if we are running in FEL mode */
> + if (!is_boot0_magic(SPL_ADDR + 4)) { /* eGON.BT0 */
> + setenv("fel_booted", "1");
> + parse_spl_header(SPL_ADDR);
> + }
> +#endif
> +
> ret = sunxi_get_sid(sid);
> if (ret == 0 && sid[0] != 0 && sid[3] != 0) {
> if (!getenv("ethaddr")) {
>
next prev parent reply other threads:[~2015-09-17 21:28 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-17 16:52 [U-Boot] [PATCH v3 0/4] sunxi: support FEL-provided environment vars and "fel" boot target Bernhard Nortmann
2015-09-17 16:52 ` [U-Boot] [PATCH v3 1/4] sunxi: move SPL-related definitions to platform-specific include Bernhard Nortmann
2015-09-18 7:58 ` Bernhard Nortmann
2015-09-20 13:06 ` Hans de Goede
2015-09-17 16:52 ` [U-Boot] [PATCH v3 2/4] sunxi: (mksunxiboot) signature to indicate "sunxi" SPL variant Bernhard Nortmann
2015-09-17 16:52 ` [U-Boot] [PATCH v3 3/4] sunxi: retrieve FEL-provided values to environment variables Bernhard Nortmann
2015-09-17 21:28 ` Hans de Goede [this message]
2015-09-17 16:52 ` [U-Boot] [PATCH v3 4/4] sunxi: add "fel" boot target Bernhard Nortmann
2015-09-17 21:48 ` [U-Boot] [PATCH v3 0/4] sunxi: support FEL-provided environment vars and " Hans de Goede
2015-09-18 7:29 ` Bernhard Nortmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55FB308F.9090505@redhat.com \
--to=hdegoede@redhat.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.