
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@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 */
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)>;u-boot,falcon-gpios = <&gpioa 13 (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_...
https://github.com/u-boot/u-boot/commit/04ad553e9c6bee62781460d2952df4962e58...
https://github.com/u-boot/u-boot/commit/aebb687a1557590bf070cf5d3478544ffff2...
But it is still not working, OP-TEE is not correctly started
regards
Patrick