[Uboot-stm32] [PATCH v2 03/11] stm32mp1: Add support for falcon mode boot from SD card

Patrick DELAUNAY patrick.delaunay at foss.st.com
Mon Oct 4 16:57:03 CEST 2021


Hi,

On 9/8/21 1:59 AM, Alexandru Gagniuc wrote:
> Falcon mode requires a board-specific mechanism to select between
> fast and normal boot. This is done via spl_start_uboot()
>
> Use the USER2 button as the selection mechanism. This is connected to
> GPIO PA13. This GPIO is already accessible via the "st,fastboot-gpios"
> devicetree node, but is is also aliased as "u-boot,falcon-gpios". This
> is the only button on DK2 which accessible simultaneously to the RESET
> button. USER2 is too close, and I can't fit my fingers to press both.
>
> The fact that USER2 is also used for android fastboot is of no
> consequence. One can let go of USER2 after SPL but before being
> sampled by u-boot. If that is missed, it's okay, u-boot tries to
> initialize the ethernet, which can be stopped with a Ctr-C. This
> conveniently opens up a u-boot shell.
>
> Offsets for raw MMC loading are defined. These point to the partition
> after "ssbl". Offsets for SPI are not defined, and thus SPL_LOAD_SPI
> must be disabled to avoid a build failure. The only way to accommodate
> this is to add a new defconfig, adventurously named stm32mp1_falcon.
>
> The baudrate is set to 2 Mbaud, as the point of this config is to boot
> fast. The default devicetree is set to -dk2. This is because EV1 does
> not have a crypto-enabled CPU, and thus enabling ECDSA support would
> have made far less sense. That and all the goodies with FIT in SPL
> are enabled to give this config some continuous integration TLC.
>
> Signed-off-by: Alexandru Gagniuc <mr.nuke.me at gmail.com>
> ---
>   arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi |   2 +
>   board/st/stm32mp1/spl.c                  |  39 +++++
>   configs/stm32mp15_falcon_defconfig       | 181 +++++++++++++++++++++++
>   3 files changed, 222 insertions(+)
>   create mode 100644 configs/stm32mp15_falcon_defconfig
>
> diff --git a/arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi b/arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi
> index 0101962ea5..b314ce2dac 100644
> --- a/arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi
> +++ b/arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi
> @@ -16,6 +16,8 @@
>   		u-boot,boot-led = "heartbeat";
>   		u-boot,error-led = "error";
>   		u-boot,mmc-env-partition = "fip";
> +		/* This is the same as fastboot-gpios. This is on purpose */
> +		u-boot,falcon-gpios = <&gpioa 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
>   		st,adc_usb_pd = <&adc1 18>, <&adc1 19>;
>   		st,fastboot-gpios = <&gpioa 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
>   		st,stm32prog-gpios = <&gpioa 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
> diff --git a/board/st/stm32mp1/spl.c b/board/st/stm32mp1/spl.c
> index 8e4549a1b3..921d0190e0 100644
> --- a/board/st/stm32mp1/spl.c
> +++ b/board/st/stm32mp1/spl.c
> @@ -8,6 +8,7 @@
>   #include <init.h>
>   #include <asm/io.h>
>   #include <asm/arch/sys_proto.h>
> +#include <asm/gpio.h>
>   #include <linux/bitops.h>
>   #include <linux/delay.h>
>   #include "../common/stpmic1.h"
> @@ -29,6 +30,44 @@ int board_early_init_f(void)
>   	return 0;
>   }
>   
> +#if IS_ENABLED(CONFIG_SPL_OS_BOOT)
> +int spl_start_uboot(void)
> +{
> +	ofnode node;
> +	struct gpio_desc gpio;
> +	int boot_uboot = 1;
> +
> +	node = ofnode_path("/config");
> +	if (!ofnode_valid(node)) {
> +		pr_warn("%s: no /config node?\n", __func__);
> +		return 0;
> +	}
> +
> +	if (gpio_request_by_name_nodev(node, "u-boot,falcon-gpios", 0, &gpio,
> +				       GPIOD_IS_IN)) {
> +		pr_warn("%s: could not find a /config/u-boot,falcon-gpios\n",
> +			__func__);
> +		return 1;
> +	}
> +
> +	boot_uboot = dm_gpio_get_value(&gpio);
> +	dm_gpio_free(NULL, &gpio);
> +
> +	return boot_uboot;
> +}
> +

I don't like the duplicated function for one key...


To avoid conflict with GPIO key already used for other purpose fastboot,

the Falcon mode activation can also use U-Boot environment

=> benefit:

1/ U-Boot can be requested by Linux before reset.... (set env boot_os=0)

2/ for first boot, the U-Boot is started to execute "spl export" before 
to set "boot_os=1"


And / or with console to force U-Boot as it is done by many other board 
(check 'c' character)


/*
* Return
* 0 if booting into OS is selected
* 1 if booting into U-Boot is selected
*/
intspl_start_uboot(void)
{/* Break into full U-Boot on 'c' */ if (serial_tstc() && serial_getc() 
== 'c') return 1;
/* check environment for falcon mode activation */
env_init();
if(env_get_yesno("boot_os") != 0)
return0;
return1;
}

> +#if IS_ENABLED(CONFIG_ARMV7_NONSEC)
> +/*
> + * A bit of a hack, but armv7_boot_nonsec() is provided by bootm.c. This is not
> + * available in SPL, so we have to provide an implementation.
> + */
> +bool armv7_boot_nonsec(void)
> +{
> +	return 0;
> +}


This hack can be avoid => CONFIG_ARMV7_NONSEC not activated


U-Boot is running in normal world after OP-TEE / loaded by SPL :

it is the same for PSCI / SCMI support !


config STM32MP15x
     bool "Support STMicroelectronics STM32MP15x Soc"
     select ARCH_SUPPORT_PSCI if !TFABOOT && !SPL_OPTEE_IMAGE
     select ARM_SMCCC if TFABOOT || SPL_OPTEE_IMAGE
     select CPU_V7A
     select CPU_V7_HAS_NONSEC if !TFABOOT && !SPL_OPTEE_IMAGE
     select CPU_V7_HAS_VIRT
     select OF_BOARD_SETUP
     select PINCTRL_STM32
     select STM32_RCC
     select STM32_RESET
     select STM32_SERIAL
     select SYS_ARCH_TIMER
     imply CMD_NVEDIT_INFO
     imply SYSRESET_PSCI if TFABOOT || SPL_OPTEE_IMAGE
     imply SYSRESET_SYSCON if !TFABOOT && !SPL_OPTEE_IMAGE



> +#endif /* CONFIG_ARMV7_NONSEC */
> +#endif /* CONFIG_SPL_OS_BOOT */
> +
>   #ifdef CONFIG_DEBUG_UART_BOARD_INIT
>   void board_debug_uart_init(void)
>   {
> diff --git a/configs/stm32mp15_falcon_defconfig b/configs/stm32mp15_falcon_defconfig

stm32mp15_falcon_defconfig or stm32mp15_spl_optee_defconfig

=> if OPTEE is loaded after SPL the U-Boot configuration change (running in secure world or not)

I am starting to work on these issues in the branch

https://github.com/u-boot/u-boot/compare/master...patrickdelaunay:spl_optee_W2140

https://github.com/u-boot/u-boot/commit/04ad553e9c6bee62781460d2952df4962e58ae14

https://github.com/u-boot/u-boot/commit/aebb687a1557590bf070cf5d3478544ffff20ca1


But it is still not working, OP-TEE is not correctly started


regards

Patrick



More information about the U-Boot mailing list