[U-Boot] [PATCH 0/6] spl: add xip booting support

This patchset adds support for XIP (execute in place) of U-Boot or kernel image and enables it for stm32f7.
Vikas Manocha (6): stm32f7: remove duplicate configs stm32: stm32f7: add spl build support SPL: Add XIP booting support serial: stm32f7: disable overrun spl: stm32f7: add kernel boot support spl: stm32f7: configure for xip booting
arch/arm/include/asm/spl.h | 1 + arch/arm/mach-stm32/Kconfig | 1 + arch/arm/mach-stm32/stm32f7/Kconfig | 24 ++++++++++++++++++++ board/st/stm32f746-disco/stm32f746-disco.c | 36 +++++++++++++++++++++++++++++- common/spl/Kconfig | 9 ++++++++ common/spl/Makefile | 1 + common/spl/spl_xip.c | 31 +++++++++++++++++++++++++ configs/stm32f746-disco_defconfig | 5 ----- drivers/serial/serial_stm32x7.c | 3 +++ drivers/serial/serial_stm32x7.h | 2 ++ include/configs/stm32f746-disco.h | 31 ++++++++++++++++++++++--- 11 files changed, 135 insertions(+), 9 deletions(-) create mode 100644 common/spl/spl_xip.c

Signed-off-by: Vikas Manocha vikas.manocha@st.com --- configs/stm32f746-disco_defconfig | 4 ---- 1 file changed, 4 deletions(-)
diff --git a/configs/stm32f746-disco_defconfig b/configs/stm32f746-disco_defconfig index 4322aad..a334d50 100644 --- a/configs/stm32f746-disco_defconfig +++ b/configs/stm32f746-disco_defconfig @@ -44,10 +44,6 @@ CONFIG_DM_SPI=y CONFIG_STM32_QSPI=y CONFIG_OF_LIBFDT_OVERLAY=y # CONFIG_EFI_LOADER is not set -CONFIG_CLK=y -CONFIG_PINCTRL=y -# CONFIG_PINCTRL_FULL is not set -CONFIG_PINCTRL_STM32=y CONFIG_RAM=y CONFIG_STM32_SDRAM=y CONFIG_DM_GPIO=y

This commit supports booting from stm32 internal nor flash. spl U-Boot initializes the sdram memory, copies next image (e.g. standard U-Boot) to sdram & then jumps to entry point.
Here are the flash memory addresses for U-Boot-spl & standard U-Boot: - spl U-Boot : 0x0800_0000 - standard U-Boot : 0x0800_8000
To compile u-boot without spl: Remove SUPPORT_SPL configuration (arch/arm/mach-stm32/Kconfig)
Signed-off-by: Vikas Manocha vikas.manocha@st.com --- arch/arm/mach-stm32/Kconfig | 1 + arch/arm/mach-stm32/stm32f7/Kconfig | 22 ++++++++++++++++++++++ board/st/stm32f746-disco/stm32f746-disco.c | 27 ++++++++++++++++++++++++++- configs/stm32f746-disco_defconfig | 1 - include/configs/stm32f746-disco.h | 22 +++++++++++++++++++++- 5 files changed, 70 insertions(+), 3 deletions(-)
diff --git a/arch/arm/mach-stm32/Kconfig b/arch/arm/mach-stm32/Kconfig index ec6b3ff..879383f 100644 --- a/arch/arm/mach-stm32/Kconfig +++ b/arch/arm/mach-stm32/Kconfig @@ -8,6 +8,7 @@ config STM32F1
config STM32F7 bool "stm32f7 family" + select SUPPORT_SPL
source "arch/arm/mach-stm32/stm32f4/Kconfig" source "arch/arm/mach-stm32/stm32f1/Kconfig" diff --git a/arch/arm/mach-stm32/stm32f7/Kconfig b/arch/arm/mach-stm32/stm32f7/Kconfig index 287e5ad..c13fafa 100644 --- a/arch/arm/mach-stm32/stm32f7/Kconfig +++ b/arch/arm/mach-stm32/stm32f7/Kconfig @@ -3,6 +3,28 @@ if STM32F7 config TARGET_STM32F746_DISCO bool "STM32F746 Discovery board"
+config SUPPORT_SPL + select SPL + select SPL_FRAMEWORK + select SPL_SERIAL_SUPPORT + select SPL_CLK + select SPL_OF_CONTROL + select SPL_OF_LIBFDT + select SPL_GPIO_SUPPORT + select SPL_LIBCOMMON_SUPPORT + select SPL_LIBGENERIC_SUPPORT + select SPL_DRIVERS_MISC_SUPPORT + select SPL_SYS_MALLOC_SIMPLE + select SPL_MTD_SUPPORT + select SPL_DM + select SPL_PINCTRL + select SPL_RAM + select SPL_DM_SEQ_ALIAS + select SPL_OF_TRANSLATE + +config SPL_PINCTRL_FULL + default n if TARGET_STM32F746_DISCO + source "board/st/stm32f746-disco/Kconfig"
endif diff --git a/board/st/stm32f746-disco/stm32f746-disco.c b/board/st/stm32f746-disco/stm32f746-disco.c index dc3a9dc..4f2b677 100644 --- a/board/st/stm32f746-disco/stm32f746-disco.c +++ b/board/st/stm32f746-disco/stm32f746-disco.c @@ -8,6 +8,7 @@ #include <common.h> #include <dm.h> #include <ram.h> +#include <spl.h> #include <asm/io.h> #include <asm/armv7m.h> #include <asm/arch/stm32.h> @@ -36,16 +37,18 @@ int get_memory_base_size(fdt_addr_t *mr_base, fdt_addr_t *mr_size) } int dram_init(void) { - struct udevice *dev; int rv; fdt_addr_t mr_base, mr_size;
+#ifndef CONFIG_SUPPORT_SPL + struct udevice *dev; rv = uclass_get_device(UCLASS_RAM, 0, &dev); if (rv) { debug("DRAM init failed: %d\n", rv); return rv; }
+#endif rv = get_memory_base_size(&mr_base, &mr_size); if (rv) return rv; @@ -87,6 +90,28 @@ int board_early_init_f(void) } #endif
+#ifdef CONFIG_SPL_BUILD +int spl_dram_init(void) +{ + struct udevice *dev; + int rv; + rv = uclass_get_device(UCLASS_RAM, 0, &dev); + if (rv) + debug("DRAM init failed: %d\n", rv); + return rv; +} +void spl_board_init(void) +{ + spl_dram_init(); + preloader_console_init(); + arch_cpu_init(); /* to configure mpu for sdram rw permissions */ +} +u32 spl_boot_device(void) +{ + return BOOT_DEVICE_NOR; +} + +#endif u32 get_board_rev(void) { return 0; diff --git a/configs/stm32f746-disco_defconfig b/configs/stm32f746-disco_defconfig index a334d50..766b111 100644 --- a/configs/stm32f746-disco_defconfig +++ b/configs/stm32f746-disco_defconfig @@ -39,7 +39,6 @@ CONFIG_ETH_DESIGNWARE=y CONFIG_PINCTRL=y # CONFIG_PINCTRL_FULL is not set CONFIG_PINCTRL_STM32=y -# CONFIG_SPL_SERIAL_PRESENT is not set CONFIG_DM_SPI=y CONFIG_STM32_QSPI=y CONFIG_OF_LIBFDT_OVERLAY=y diff --git a/include/configs/stm32f746-disco.h b/include/configs/stm32f746-disco.h index 1ee5815..055fdf8 100644 --- a/include/configs/stm32f746-disco.h +++ b/include/configs/stm32f746-disco.h @@ -10,7 +10,12 @@
#define CONFIG_SYS_FLASH_BASE 0x08000000 #define CONFIG_SYS_INIT_SP_ADDR 0x20050000 -#define CONFIG_SYS_TEXT_BASE 0x08000000 + +#ifdef CONFIG_SUPPORT_SPL +#define CONFIG_SYS_TEXT_BASE 0xC0000000 +#else +#define CONFIG_SYS_TEXT_BASE CONFIG_SYS_FLASH_BASE +#endif
/* * Configuration of the external SDRAM memory @@ -69,4 +74,19 @@ #define CONFIG_CMD_CACHE #define CONFIG_BOARD_LATE_INIT #define CONFIG_DISPLAY_BOARDINFO + +/* For SPL */ +#ifdef CONFIG_SUPPORT_SPL +#define CONFIG_SPL_STACK CONFIG_SYS_INIT_SP_ADDR +#define CONFIG_SPL_FRAMEWORK +#define CONFIG_SPL_BOARD_INIT +#define CONFIG_SPL_TEXT_BASE CONFIG_SYS_FLASH_BASE +#define CONFIG_SYS_MONITOR_LEN (512 * 1024) +#define CONFIG_SYS_SPL_LEN 0x00008000 +#define CONFIG_SYS_UBOOT_START 0XC00003FD +#define CONFIG_SYS_UBOOT_BASE (CONFIG_SYS_FLASH_BASE + \ + CONFIG_SYS_SPL_LEN) +#endif +/* For SPL ends */ + #endif /* __CONFIG_H */

Enable support for XIP (execute in place) of U-Boot or kernel image. There is no need to copy image from flash to ram if flash supports execute in place.
Signed-off-by: Vikas Manocha vikas.manocha@st.com --- arch/arm/include/asm/spl.h | 1 + board/st/stm32f746-disco/stm32f746-disco.c | 1 + common/spl/Kconfig | 9 +++++++++ common/spl/Makefile | 1 + common/spl/spl_xip.c | 31 ++++++++++++++++++++++++++++++ 5 files changed, 43 insertions(+) create mode 100644 common/spl/spl_xip.c
diff --git a/arch/arm/include/asm/spl.h b/arch/arm/include/asm/spl.h index a0bda28..0a3536b 100644 --- a/arch/arm/include/asm/spl.h +++ b/arch/arm/include/asm/spl.h @@ -29,6 +29,7 @@ enum { BOOT_DEVICE_I2C, BOOT_DEVICE_BOARD, BOOT_DEVICE_DFU, + BOOT_DEVICE_XIP, BOOT_DEVICE_NONE }; #endif diff --git a/board/st/stm32f746-disco/stm32f746-disco.c b/board/st/stm32f746-disco/stm32f746-disco.c index 4f2b677..e330b1f 100644 --- a/board/st/stm32f746-disco/stm32f746-disco.c +++ b/board/st/stm32f746-disco/stm32f746-disco.c @@ -91,6 +91,7 @@ int board_early_init_f(void) #endif
#ifdef CONFIG_SPL_BUILD + int spl_dram_init(void) { struct udevice *dev; diff --git a/common/spl/Kconfig b/common/spl/Kconfig index f51ae2c..52a5271 100644 --- a/common/spl/Kconfig +++ b/common/spl/Kconfig @@ -459,6 +459,15 @@ config SPL_NOR_SUPPORT a memory-mapped device makes it very easy to access. Loading from NOR is typically achieved with just a memcpy().
+config SPL_XIP_SUPPORT + bool "Support XIP" + depends on SPL + help + Enable support for execute in place of U-Boot or kernel image. There + is no need to copy image from flash to ram if flash supports execute + in place. Its very useful in systems having enough flash but not + enough ram to load the image. + config SPL_ONENAND_SUPPORT bool "Support OneNAND flash" depends on SPL diff --git a/common/spl/Makefile b/common/spl/Makefile index 1933cbd..88deeaf 100644 --- a/common/spl/Makefile +++ b/common/spl/Makefile @@ -12,6 +12,7 @@ ifdef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_FRAMEWORK) += spl.o obj-$(CONFIG_SPL_LOAD_FIT) += spl_fit.o obj-$(CONFIG_SPL_NOR_SUPPORT) += spl_nor.o +obj-$(CONFIG_SPL_XIP_SUPPORT) += spl_xip.o obj-$(CONFIG_SPL_YMODEM_SUPPORT) += spl_ymodem.o ifndef CONFIG_SPL_UBI obj-$(CONFIG_SPL_NAND_SUPPORT) += spl_nand.o diff --git a/common/spl/spl_xip.c b/common/spl/spl_xip.c new file mode 100644 index 0000000..50e2f34 --- /dev/null +++ b/common/spl/spl_xip.c @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2017 Vikas Manocha vikas.manocha@st.com + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <spl.h> + +static int spl_xip(struct spl_image_info *spl_image, + struct spl_boot_device *bootdev) +{ +#ifdef CONFIG_SPL_OS_BOOT + if (!spl_start_uboot()) { + spl_image->arg = (void *)CONFIG_SYS_FDT_BASE; + spl_image->name = "Linux"; + spl_image->os = IH_OS_LINUX; + spl_image->load_addr = CONFIG_SYS_LOAD_ADDR; + spl_image->entry_point = CONFIG_SYS_LOAD_ADDR; +#ifdef CONFIG_CPU_V7M + spl_image->entry_point |= 0x1; +#endif + debug("spl: payload xipImage, load addr: 0x%lx\n", + spl_image->load_addr); + return 0; + } +#endif + return(spl_parse_image_header(spl_image, (const struct image_header *) + CONFIG_SYS_UBOOT_BASE)); +} +SPL_LOAD_IMAGE_METHOD("XIP", 0, BOOT_DEVICE_XIP, spl_xip);

On 05/18/2017 11:49 AM, Vikas Manocha wrote:
Enable support for XIP (execute in place) of U-Boot or kernel image. There is no need to copy image from flash to ram if flash supports execute in place.
Awesome. I've had to hack u-boot before to achieve exactly this. It's nice to have a proper implementation.
[snip]
diff --git a/board/st/stm32f746-disco/stm32f746-disco.c b/board/st/stm32f746-disco/stm32f746-disco.c index 4f2b677..e330b1f 100644 --- a/board/st/stm32f746-disco/stm32f746-disco.c +++ b/board/st/stm32f746-disco/stm32f746-disco.c @@ -91,6 +91,7 @@ int board_early_init_f(void) #endif
#ifdef CONFIG_SPL_BUILD
Unrelated change.
[snip]
diff --git a/common/spl/spl_xip.c b/common/spl/spl_xip.c new file mode 100644 index 0000000..50e2f34 --- /dev/null +++ b/common/spl/spl_xip.c @@ -0,0 +1,31 @@ +/*
- Copyright (C) 2017 Vikas Manocha vikas.manocha@st.com
- SPDX-License-Identifier: GPL-2.0+
- */
+#include <common.h> +#include <spl.h>
+static int spl_xip(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev)
+{ +#ifdef CONFIG_SPL_OS_BOOT
- if (!spl_start_uboot()) {
spl_image->arg = (void *)CONFIG_SYS_FDT_BASE;
spl_image->name = "Linux";
spl_image->os = IH_OS_LINUX;
spl_image->load_addr = CONFIG_SYS_LOAD_ADDR;
spl_image->entry_point = CONFIG_SYS_LOAD_ADDR;
+#ifdef CONFIG_CPU_V7M
This looks like it should be handled by spl_set_header_raw_uboot(). I don't see other SPL loaders do this.
spl_image->entry_point |= 0x1;
+#endif
debug("spl: payload xipImage, load addr: 0x%lx\n",
spl_image->load_addr);
return 0;
- }
+#endif
- return(spl_parse_image_header(spl_image, (const struct image_header *)
CONFIG_SYS_UBOOT_BASE));
+} +SPL_LOAD_IMAGE_METHOD("XIP", 0, BOOT_DEVICE_XIP, spl_xip);
Alex

Hi Alex,
-----Original Message----- From: Alexandru Gagniuc [mailto:alex.g@adaptrum.com] Sent: Thursday, May 18, 2017 12:51 PM To: Vikas MANOCHA vikas.manocha@st.com; u-boot@lists.denx.de Cc: Patrick DELAUNAY patrick.delaunay@st.com; Patrice CHOTARD patrice.chotard@st.com; Christophe KERELLO christophe.kerello@st.com; Christophe PRIOUZEAU christophe.priouzeau@st.com; Alexandre TORGUE alexandre.torgue@st.com; Albert Aribaud albert.u.boot@aribaud.net; Andrew F. Davis afd@ti.com; Bin Meng bmeng.cn@gmail.com; B, Ravi ravibabu@ti.com; Heiko Schocher hs@denx.de; Ladislav Michl ladis@linux-mips.org; Masahiro Yamada yamada.masahiro@socionext.com; Michal Simek michal.simek@xilinx.com; Simon Glass sjg@chromium.org; Stefan Agner stefan.agner@toradex.com Subject: Re: [PATCH 3/6] SPL: Add XIP booting support
On 05/18/2017 11:49 AM, Vikas Manocha wrote:
Enable support for XIP (execute in place) of U-Boot or kernel image. There is no need to copy image from flash to ram if flash supports execute in place.
Awesome. I've had to hack u-boot before to achieve exactly this. It's nice to have a proper implementation.
[snip]
diff --git a/board/st/stm32f746-disco/stm32f746-disco.c b/board/st/stm32f746-disco/stm32f746-disco.c index 4f2b677..e330b1f 100644 --- a/board/st/stm32f746-disco/stm32f746-disco.c +++ b/board/st/stm32f746-disco/stm32f746-disco.c @@ -91,6 +91,7 @@ int board_early_init_f(void) #endif
#ifdef CONFIG_SPL_BUILD
Unrelated change.
Oops! I will remove this blank line & so the file from this patch in v2.
[snip]
diff --git a/common/spl/spl_xip.c b/common/spl/spl_xip.c new file mode 100644 index 0000000..50e2f34 --- /dev/null +++ b/common/spl/spl_xip.c @@ -0,0 +1,31 @@ +/*
- Copyright (C) 2017 Vikas Manocha vikas.manocha@st.com
- SPDX-License-Identifier: GPL-2.0+
- */
+#include <common.h> +#include <spl.h>
+static int spl_xip(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev)
+{ +#ifdef CONFIG_SPL_OS_BOOT
- if (!spl_start_uboot()) {
spl_image->arg = (void *)CONFIG_SYS_FDT_BASE;
spl_image->name = "Linux";
spl_image->os = IH_OS_LINUX;
spl_image->load_addr = CONFIG_SYS_LOAD_ADDR;
spl_image->entry_point = CONFIG_SYS_LOAD_ADDR;
+#ifdef CONFIG_CPU_V7M
This looks like it should be handled by spl_set_header_raw_uboot(). I don't see other SPL loaders do this.
We might not want to boot kernel if header is not present in every situation. With spl_xip config option, we enable if we need it.
Cheers, Vikas
spl_image->entry_point |= 0x1;
+#endif
debug("spl: payload xipImage, load addr: 0x%lx\n",
spl_image->load_addr);
return 0;
- }
+#endif
- return(spl_parse_image_header(spl_image, (const struct image_header *)
CONFIG_SYS_UBOOT_BASE));
+} +SPL_LOAD_IMAGE_METHOD("XIP", 0, BOOT_DEVICE_XIP, spl_xip);
Alex

On 05/22/2017 09:55 AM, Vikas MANOCHA wrote:
Hi Alex,
Hi
[snip]
diff --git a/common/spl/spl_xip.c b/common/spl/spl_xip.c new file mode 100644 index 0000000..50e2f34 --- /dev/null +++ b/common/spl/spl_xip.c @@ -0,0 +1,31 @@ +/*
- Copyright (C) 2017 Vikas Manocha vikas.manocha@st.com
- SPDX-License-Identifier: GPL-2.0+
- */
+#include <common.h> +#include <spl.h>
+static int spl_xip(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev)
+{ +#ifdef CONFIG_SPL_OS_BOOT
- if (!spl_start_uboot()) {
spl_image->arg = (void *)CONFIG_SYS_FDT_BASE;
spl_image->name = "Linux";
spl_image->os = IH_OS_LINUX;
spl_image->load_addr = CONFIG_SYS_LOAD_ADDR;
spl_image->entry_point = CONFIG_SYS_LOAD_ADDR;
+#ifdef CONFIG_CPU_V7M
This looks like it should be handled by spl_set_header_raw_uboot(). I don't see other SPL loaders do this.
We might not want to boot kernel if header is not present in every situation. With spl_xip config option, we enable if we need it.
I'm talkVing about the '#ifdef CONFIG_CPU_7M' part. A lot of the spl loaders are mostly boilerplate, but it should be consistent boilerplate. If there is a good reason to have a different boilerplate, then at the very least a comment should explain "why" it is done different.
Alex

Hi Alex,
-----Original Message----- From: Alexandru Gagniuc [mailto:alex.g@adaptrum.com] Sent: Monday, May 22, 2017 10:37 AM To: Vikas MANOCHA vikas.manocha@st.com; u-boot@lists.denx.de Cc: Patrick DELAUNAY patrick.delaunay@st.com; Patrice CHOTARD patrice.chotard@st.com; Christophe KERELLO christophe.kerello@st.com; Christophe PRIOUZEAU christophe.priouzeau@st.com; Alexandre TORGUE alexandre.torgue@st.com; Albert Aribaud albert.u.boot@aribaud.net; Andrew F. Davis afd@ti.com; Bin Meng bmeng.cn@gmail.com; B, Ravi ravibabu@ti.com; Heiko Schocher hs@denx.de; Ladislav Michl ladis@linux-mips.org; Masahiro Yamada yamada.masahiro@socionext.com; Michal Simek michal.simek@xilinx.com; Simon Glass sjg@chromium.org; Stefan Agner stefan.agner@toradex.com Subject: Re: [PATCH 3/6] SPL: Add XIP booting support
On 05/22/2017 09:55 AM, Vikas MANOCHA wrote:
Hi Alex,
Hi
[snip]
diff --git a/common/spl/spl_xip.c b/common/spl/spl_xip.c new file mode 100644 index 0000000..50e2f34 --- /dev/null +++ b/common/spl/spl_xip.c @@ -0,0 +1,31 @@ +/*
- Copyright (C) 2017 Vikas Manocha vikas.manocha@st.com
- SPDX-License-Identifier: GPL-2.0+
- */
+#include <common.h> +#include <spl.h>
+static int spl_xip(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev) { #ifdef CONFIG_SPL_OS_BOOT
- if (!spl_start_uboot()) {
spl_image->arg = (void *)CONFIG_SYS_FDT_BASE;
spl_image->name = "Linux";
spl_image->os = IH_OS_LINUX;
spl_image->load_addr = CONFIG_SYS_LOAD_ADDR;
spl_image->entry_point = CONFIG_SYS_LOAD_ADDR; #ifdef
+CONFIG_CPU_V7M
This looks like it should be handled by spl_set_header_raw_uboot(). I don't see other SPL loaders do this.
We might not want to boot kernel if header is not present in every situation. With spl_xip config option, we enable if we need it.
I'm talkVing about the '#ifdef CONFIG_CPU_7M' part. A lot of the spl loaders are mostly boilerplate, but it should be consistent boilerplate. If there is a good reason to have a different boilerplate, then at the very least a comment should explain "why" it is done different.
#ifdef CONFIG_CPU_V7M part is to keep v7m cpu in thumb mode as it does not support arm mode. The same is the reason for it to be in spl_set_header_raw_uboot().
On a second thought, I think it will be good to move this part just before booting next image. In that case it would be required just once. I will send a separate patch for it.
Cheers, Vikas
Alex

With overrun enabled, serial port console freezes & stops receiving data with overun error if we keep sending data.
Signed-off-by: Vikas Manocha vikas.manocha@st.com --- drivers/serial/serial_stm32x7.c | 3 +++ drivers/serial/serial_stm32x7.h | 2 ++ 2 files changed, 5 insertions(+)
diff --git a/drivers/serial/serial_stm32x7.c b/drivers/serial/serial_stm32x7.c index 1907cef..2b305cd 100644 --- a/drivers/serial/serial_stm32x7.c +++ b/drivers/serial/serial_stm32x7.c @@ -93,6 +93,9 @@ static int stm32_serial_probe(struct udevice *dev) } #endif
+ /* Disable usart-> disable overrun-> enable usart */ + clrbits_le32(&usart->cr1, USART_CR1_RE | USART_CR1_TE | USART_CR1_UE); + setbits_le32(&usart->cr3, USART_CR3_OVRDIS); setbits_le32(&usart->cr1, USART_CR1_RE | USART_CR1_TE | USART_CR1_UE);
return 0; diff --git a/drivers/serial/serial_stm32x7.h b/drivers/serial/serial_stm32x7.h index 6190d67..8c02548 100644 --- a/drivers/serial/serial_stm32x7.h +++ b/drivers/serial/serial_stm32x7.h @@ -27,6 +27,8 @@ struct stm32_usart { #define USART_CR1_TE (1 << 3) #define USART_CR1_UE (1 << 0)
+#define USART_CR3_OVRDIS (1 << 12) + #define USART_SR_FLAG_RXNE (1 << 5) #define USART_SR_FLAG_TXE (1 << 7)

Signed-off-by: Vikas Manocha vikas.manocha@st.com --- arch/arm/mach-stm32/stm32f7/Kconfig | 1 + board/st/stm32f746-disco/stm32f746-disco.c | 8 ++++++++ include/configs/stm32f746-disco.h | 7 +++++++ 3 files changed, 16 insertions(+)
diff --git a/arch/arm/mach-stm32/stm32f7/Kconfig b/arch/arm/mach-stm32/stm32f7/Kconfig index c13fafa..3f6455e 100644 --- a/arch/arm/mach-stm32/stm32f7/Kconfig +++ b/arch/arm/mach-stm32/stm32f7/Kconfig @@ -21,6 +21,7 @@ config SUPPORT_SPL select SPL_RAM select SPL_DM_SEQ_ALIAS select SPL_OF_TRANSLATE + select SPL_OS_BOOT
config SPL_PINCTRL_FULL default n if TARGET_STM32F746_DISCO diff --git a/board/st/stm32f746-disco/stm32f746-disco.c b/board/st/stm32f746-disco/stm32f746-disco.c index e330b1f..335dcb9 100644 --- a/board/st/stm32f746-disco/stm32f746-disco.c +++ b/board/st/stm32f746-disco/stm32f746-disco.c @@ -91,6 +91,14 @@ int board_early_init_f(void) #endif
#ifdef CONFIG_SPL_BUILD +#ifdef CONFIG_SPL_OS_BOOT +int spl_start_uboot(void) +{ + debug("SPL: booting kernel\n"); + /* break into full u-boot on 'c' */ + return serial_tstc() && serial_getc() == 'c'; +} +#endif
int spl_dram_init(void) { diff --git a/include/configs/stm32f746-disco.h b/include/configs/stm32f746-disco.h index 055fdf8..9052025 100644 --- a/include/configs/stm32f746-disco.h +++ b/include/configs/stm32f746-disco.h @@ -86,6 +86,13 @@ #define CONFIG_SYS_UBOOT_START 0XC00003FD #define CONFIG_SYS_UBOOT_BASE (CONFIG_SYS_FLASH_BASE + \ CONFIG_SYS_SPL_LEN) + +#define CONFIG_SYS_OS_BASE 0x08040000 +/* DT blob (fdt) address */ +#define CONFIG_SYS_SPL_ARGS_ADDR 0xC0000100 +#define CONFIG_SYS_FDT_BASE (CONFIG_SYS_FLASH_BASE + \ + 0x1C0000) +#define CONFIG_SYS_FDT_SIZE (20*1024) #endif /* For SPL ends */

With xip booting configuration, we don't need to copy the next image (U-Boot or linux xipimage) from flash to sdram area.
Flash memory organization is like this: spl-U-Boot: u-boot-spl.bin : 0x0800_0000 U-Boot : u-boot-dtb.bin : 0x0800_8000 linux : xipImage : 0x0800_8000
It is also possible to have U-Boot binary & linux binaries configured at different addresses of flash memory like U-Boot at 0x0800_8000 & linux xipImage at 0x0800_4000. But in any case, spl-U-Boot needs to be compiled for U-Boot as next binary with SPL_OS_BOOT option disabled. By default, spl is configured to boot linux xipImage.
Signed-off-by: Vikas Manocha vikas.manocha@st.com --- arch/arm/mach-stm32/stm32f7/Kconfig | 1 + board/st/stm32f746-disco/stm32f746-disco.c | 2 +- include/configs/stm32f746-disco.h | 12 +++++------- 3 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/arch/arm/mach-stm32/stm32f7/Kconfig b/arch/arm/mach-stm32/stm32f7/Kconfig index 3f6455e..6acf9cf 100644 --- a/arch/arm/mach-stm32/stm32f7/Kconfig +++ b/arch/arm/mach-stm32/stm32f7/Kconfig @@ -22,6 +22,7 @@ config SUPPORT_SPL select SPL_DM_SEQ_ALIAS select SPL_OF_TRANSLATE select SPL_OS_BOOT + select SPL_XIP_SUPPORT
config SPL_PINCTRL_FULL default n if TARGET_STM32F746_DISCO diff --git a/board/st/stm32f746-disco/stm32f746-disco.c b/board/st/stm32f746-disco/stm32f746-disco.c index 335dcb9..11957e0 100644 --- a/board/st/stm32f746-disco/stm32f746-disco.c +++ b/board/st/stm32f746-disco/stm32f746-disco.c @@ -117,7 +117,7 @@ void spl_board_init(void) } u32 spl_boot_device(void) { - return BOOT_DEVICE_NOR; + return BOOT_DEVICE_XIP; }
#endif diff --git a/include/configs/stm32f746-disco.h b/include/configs/stm32f746-disco.h index 9052025..4e0edcb 100644 --- a/include/configs/stm32f746-disco.h +++ b/include/configs/stm32f746-disco.h @@ -12,17 +12,18 @@ #define CONFIG_SYS_INIT_SP_ADDR 0x20050000
#ifdef CONFIG_SUPPORT_SPL -#define CONFIG_SYS_TEXT_BASE 0xC0000000 +#define CONFIG_SYS_TEXT_BASE 0x08008000 +#define CONFIG_SYS_LOAD_ADDR 0x08008000 #else #define CONFIG_SYS_TEXT_BASE CONFIG_SYS_FLASH_BASE +#define CONFIG_SYS_LOAD_ADDR 0xC0400000 +#define CONFIG_LOADADDR 0xC0400000 #endif
/* * Configuration of the external SDRAM memory */ #define CONFIG_NR_DRAM_BANKS 1 -#define CONFIG_SYS_LOAD_ADDR 0xC0400000 -#define CONFIG_LOADADDR 0xC0400000
#define CONFIG_SYS_MAX_FLASH_SECT 8 #define CONFIG_SYS_MAX_FLASH_BANKS 1 @@ -83,16 +84,13 @@ #define CONFIG_SPL_TEXT_BASE CONFIG_SYS_FLASH_BASE #define CONFIG_SYS_MONITOR_LEN (512 * 1024) #define CONFIG_SYS_SPL_LEN 0x00008000 -#define CONFIG_SYS_UBOOT_START 0XC00003FD +#define CONFIG_SYS_UBOOT_START 0x080083FD #define CONFIG_SYS_UBOOT_BASE (CONFIG_SYS_FLASH_BASE + \ CONFIG_SYS_SPL_LEN)
-#define CONFIG_SYS_OS_BASE 0x08040000 /* DT blob (fdt) address */ -#define CONFIG_SYS_SPL_ARGS_ADDR 0xC0000100 #define CONFIG_SYS_FDT_BASE (CONFIG_SYS_FLASH_BASE + \ 0x1C0000) -#define CONFIG_SYS_FDT_SIZE (20*1024) #endif /* For SPL ends */
participants (3)
-
Alexandru Gagniuc
-
Vikas MANOCHA
-
Vikas Manocha