mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Lucas Stach <l.stach@pengutronix.de>
To: Rouven Czerwinski <r.czerwinski@pengutronix.de>,
	barebox@lists.infradead.org
Subject: Re: [PATCH v2 16/16] boards: nxp-mx8-evk: rework to different boot flow
Date: Mon, 05 Aug 2019 12:37:58 +0200	[thread overview]
Message-ID: <1565001478.2323.1.camel@pengutronix.de> (raw)
In-Reply-To: <209a8ba450cb170543983cbb0a57be65838e639a.1564997015.git-series.r.czerwinski@pengutronix.de>

Am Montag, den 05.08.2019, 11:23 +0200 schrieb Rouven Czerwinski:
> Rework the evk boot flow to use the new piggydata load function and
> install a trampoline for the TF-A setup. This allows the PBL boot
> process to stay in SRAM up until the verification of the piggydata is
> done and main barebox can be loaded.
> 
> The trampoline loads 4 bytes right after the trampoline, we copy the
> runtime offset there so the trampoline jumps back into the SRAM PBL.
> 
> > Signed-off-by: Rouven Czerwinski <r.czerwinski@pengutronix.de>
> ---
>  arch/arm/boards/nxp-imx8mq-evk/Makefile                       |  4 +-
>  arch/arm/boards/nxp-imx8mq-evk/flash-header-imx8mq-evk.imxcfg |  1 +-
>  arch/arm/boards/nxp-imx8mq-evk/lowlevel.c                     | 83 +++----
>  arch/arm/boards/nxp-imx8mq-evk/trampoline.S                   | 11 +-
>  images/Makefile.imx                                           |  3 +-
>  5 files changed, 60 insertions(+), 42 deletions(-)
>  create mode 100644 arch/arm/boards/nxp-imx8mq-evk/trampoline.S
> 
> diff --git a/arch/arm/boards/nxp-imx8mq-evk/Makefile b/arch/arm/boards/nxp-imx8mq-evk/Makefile
> index 0546b0b..7907de4 100644
> --- a/arch/arm/boards/nxp-imx8mq-evk/Makefile
> +++ b/arch/arm/boards/nxp-imx8mq-evk/Makefile
> @@ -1,4 +1,2 @@
>  obj-y += board.o
> -lwl-y += lowlevel.o ddr_init.o ddrphy_train.o
> -
> -
> +lwl-y += lowlevel.o ddr_init.o ddrphy_train.o trampoline.o
> diff --git a/arch/arm/boards/nxp-imx8mq-evk/flash-header-imx8mq-evk.imxcfg b/arch/arm/boards/nxp-imx8mq-evk/flash-header-imx8mq-evk.imxcfg
> index aff8321..11463fe 100644
> --- a/arch/arm/boards/nxp-imx8mq-evk/flash-header-imx8mq-evk.imxcfg
> +++ b/arch/arm/boards/nxp-imx8mq-evk/flash-header-imx8mq-evk.imxcfg
> @@ -3,3 +3,4 @@ soc imx8mq
>  loadaddr 0x007E1000
>  max_load_size 0x3F000
>  dcdofs 0x400
> +#include <mach/habv4-imx8-gencsf.h>
> diff --git a/arch/arm/boards/nxp-imx8mq-evk/lowlevel.c b/arch/arm/boards/nxp-imx8mq-evk/lowlevel.c
> index 6451e5d..2e23a4c 100644
> --- a/arch/arm/boards/nxp-imx8mq-evk/lowlevel.c
> +++ b/arch/arm/boards/nxp-imx8mq-evk/lowlevel.c
> @@ -53,20 +53,29 @@ static void setup_uart(void)
>  
>  static void nxp_imx8mq_evk_sram_setup(void)
>  {
> > -	enum bootsource src = BOOTSOURCE_UNKNOWN;
> > -	int instance = BOOTSOURCE_INSTANCE_UNKNOWN;
> > -	int ret = -ENOTSUPP;
> -
> >  	ddr_init();
> +}
>  
> > -	imx8_get_boot_source(&src, &instance);
> +extern unsigned char trampoline_start[];
> +extern unsigned char trampoline_end[];
>  
> > -	if (src == BOOTSOURCE_MMC)
> > -		ret = imx8_esdhc_start_image(instance);
> +static void nxp_imx8mq_evk_install_tfa_trampoline(void)
> +{
> > +	unsigned int tramp_len;
> > +	unsigned int offset;
> > +	/*
> > +	 * Create a trampoline which is places in DRAM and calls back into the
> > +	 * PBL entry function found in the TCRAM. Register x0 is set to 1 to
> > +	 * indicate that DRAM setup was already run.
> > +	 */
> > +	tramp_len = (void *)trampoline_end - (void *)trampoline_start;
> > +	memcpy((void *)MX8MQ_ATF_BL33_BASE_ADDR, (void *)trampoline_start,
> > +	       tramp_len);
>  
> > -	BUG_ON(ret);
> > +	offset = get_runtime_offset();
> > +	memcpy((void *)MX8MQ_ATF_BL33_BASE_ADDR + tramp_len, &offset,
> > +	       sizeof(offset));
>  }
> -
>  /*
>   * Power-on execution flow of start_nxp_imx8mq_evk() might not be
>   * obvious for a very first read, so here's, hopefully helpful,
> @@ -75,53 +84,53 @@ static void nxp_imx8mq_evk_sram_setup(void)
>   * 1. MaskROM uploads PBL into OCRAM and that's where this function is
>   *    executed for the first time
>   *
> - * 2. DDR is initialized and full i.MX image is loaded to the
> - *    beginning of RAM
> - *
> - * 3. start_nxp_imx8mq_evk, now in RAM, is executed again
> + * 2. DDR is initialized and the TF-A trampoline is installed in the
> + *    DRAM.
>   *
> - * 4. BL31 blob is uploaded to OCRAM and the control is transfer to it
> + * 3. TF-A is executed and exits into the trampoline in RAM, which enters the
> + *    PBL for the second time. DRAM setup done is indicated by a one in register
> + *    x0 by the trampoline

Why change this and add additional register state here? Checking for
EL2 should work fine for this.

Regards,
Lucas

>   *
> - * 5. BL31 exits EL3 into EL2 at address MX8MQ_ATF_BL33_BASE_ADDR,
> - *    executing start_nxp_imx8mq_evk() the third time
> + * 4. The piggydata is loaded from the SD card and copied to the expected
> + *    location in the DRAM.
>   *
> - * 6. Standard barebox boot flow continues
> + * 5. Standard barebox boot flow continues
>   */
>  ENTRY_FUNCTION(start_nxp_imx8mq_evk, r0, r1, r2)
>  {
> > +	enum bootsource src = BOOTSOURCE_UNKNOWN;
> > +	int instance = BOOTSOURCE_INSTANCE_UNKNOWN;
> > +	int ret = -ENOTSUPP;
> > +	const u8 *bl31;
> > +	size_t bl31_size;
> +
> >  	imx8mq_cpu_lowlevel_init();
>  
> >  	if (IS_ENABLED(CONFIG_DEBUG_LL))
> >  		setup_uart();
>  
> > -	if (get_pc() < MX8MQ_DDR_CSD1_BASE_ADDR) {
> > -		/*
> > -		 * We assume that we were just loaded by MaskROM into
> > -		 * SRAM if we are not running from DDR. We also assume
> > -		 * that means DDR needs to be initialized for the
> > -		 * first time.
> > -		 */
> > -		nxp_imx8mq_evk_sram_setup();
> > -	}
> >  	/*
> > -	 * Straight from the power-on we are at EL3, so the following
> > -	 * code _will_ load and jump to ATF.
> > -	 *
> > -	 * However when we are re-executed upon exit from ATF's
> > -	 * initialization routine, it is EL2 which means we'll skip
> > -	 * loadting ATF blob again
> > +	 * if register r0 does not contain 1, we are running for the first time
> > +	 * and need to initialize the DRAM, install the trampoline and run TF-A
> > +	 * (BL31).
> > +	 * Otherwise the 1 indicates that the DRAM setup and trampoline are
> > +	 * already installed and TF-A has been run. In this case we can skip
> >  	 */
> > -	if (current_el() == 3) {
> > -		const u8 *bl31;
> > -		size_t bl31_size;
> -
> > +	if (r0 != 1) {
> > +		nxp_imx8mq_evk_sram_setup();
> > +		nxp_imx8mq_evk_install_tfa_trampoline();
> >  		get_builtin_firmware(imx8mq_bl31_bin, &bl31, &bl31_size);
> >  		imx8mq_atf_load_bl31(bl31, bl31_size);
> >  	}
>  
> > +	imx8_get_boot_source(&src, &instance);
> +
> > +	if (src == BOOTSOURCE_MMC)
> > +		ret = imx8_esdhc_load_piggy(instance);
> > +	else
> > +		BUG_ON(ret);
> >  	/*
> >  	 * Standard entry we hit once we initialized both DDR and ATF
> >  	 */
> >  	imx8mq_barebox_entry(__dtb_imx8mq_evk_start);
>  }
> -
> diff --git a/arch/arm/boards/nxp-imx8mq-evk/trampoline.S b/arch/arm/boards/nxp-imx8mq-evk/trampoline.S
> new file mode 100644
> index 0000000..49bd750
> --- /dev/null
> +++ b/arch/arm/boards/nxp-imx8mq-evk/trampoline.S
> @@ -0,0 +1,11 @@
> +/* SPDX-License-Identifier: (GPL-2.0) */
> +#include <linux/linkage.h>
> +#include <asm/sections.h>
> > +	.section .trampoline,"a"
> > +	.globl  trampoline_start
> +trampoline_start:
> > > +	ldr	w19, trampoline_end
> > +	mov     x0, #0x1
> > +	br      x19
> > +	.globl  trampoline_end
> +trampoline_end:
> diff --git a/images/Makefile.imx b/images/Makefile.imx
> index 76beccb..0fd1fe1 100644
> --- a/images/Makefile.imx
> +++ b/images/Makefile.imx
> @@ -582,8 +582,7 @@ image-$(CONFIG_MACH_ZII_IMX7D_DEV) += barebox-zii-imx7d-dev.img
>  # ----------------------- i.MX8mq based boards --------------------------
>  pblb-$(CONFIG_MACH_NXP_IMX8MQ_EVK) += start_nxp_imx8mq_evk
>  CFG_start_nxp_imx8mq_evk.pblb.imximg = $(board)/nxp-imx8mq-evk/flash-header-imx8mq-evk.imxcfg
> -MAX_PBL_MEMORY_SIZE_start_nxp_imx8mq_evk = 0x3f000
> -FILE_barebox-nxp-imx8mq-evk.img = start_nxp_imx8mq_evk.pblb.imximg
> +FILE_barebox-nxp-imx8mq-evk.img = start_nxp_imx8mq_evk.pblb.pimximg
>  image-$(CONFIG_MACH_NXP_IMX8MQ_EVK) += barebox-nxp-imx8mq-evk.img
>  
>  pblb-$(CONFIG_MACH_ZII_IMX8MQ_DEV) += start_zii_imx8mq_dev

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  reply	other threads:[~2019-08-05 10:38 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-05  9:23 [PATCH v2 00/16] HAB for i.MX8MQ Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 01/16] i.MX: HABv4: ignore return for i.MX28/6 initcalls Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 02/16] i.MX: HABv4: implement interface for i.MX8MQ Rouven Czerwinski
2019-08-05 12:12   ` Lucas Stach
2019-08-05  9:23 ` [PATCH v2 03/16] mach-imx: enable HAB on i.MX8MQ Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 04/16] arm: lib: add CSF section between PBL and piggy Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 05/16] esdhc-pbl: extract header parsing from image start Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 06/16] esdhc-pbl: add piggy load function Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 07/16] sections: fix macro for barebox_pbl_size Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 08/16] scripts: imx: support signing for i.MX8MQ Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 09/16] images: always build sha256sum into pbl Rouven Czerwinski
2019-08-05 12:20   ` Lucas Stach
2019-08-05 12:52     ` Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 10/16] pbl: add sha256 and piggy verification to PBL Rouven Czerwinski
2019-08-05 11:00   ` Lucas Stach
2019-08-05 12:57     ` Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 11/16] stdio: puts and putchar static inline wrappers Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 12/16] pbl: support panic with log output Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 13/16] arm: uncompress: verify sha256 if enabled Rouven Czerwinski
2019-08-05 10:42   ` Lucas Stach
2019-08-05  9:23 ` [PATCH v2 14/16] mach-imx: add gencsf header for i.MX8MQ Rouven Czerwinski
2019-08-05  9:23 ` [PATCH v2 15/16] mach-imx: hab: select piggy verification for i.MX8 Rouven Czerwinski
2019-08-05 10:39   ` Lucas Stach
2019-08-05  9:23 ` [PATCH v2 16/16] boards: nxp-mx8-evk: rework to different boot flow Rouven Czerwinski
2019-08-05 10:37   ` Lucas Stach [this message]
2019-08-05 12:59     ` Rouven Czerwinski

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=1565001478.2323.1.camel@pengutronix.de \
    --to=l.stach@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=r.czerwinski@pengutronix.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox