From 3b6f43a4af188b857c9d5a72e12a9de9c07b51b4 Mon Sep 17 00:00:00 2001 From: Patrick Delaunay <patrick.delaunay@st.com> Date: Wed, 7 Oct 2020 12:51:46 +0200 Subject: [PATCH] plat/st: add boot from UART support Handle boot from UART with STM32CubeProgammer with mmap io. Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com> Change-Id: Ibd719dd46a11da78633728675ef6639635b6cf67 Reviewed-on: https://gerrit.st.com/c/mpu/oe/st/tf-a/+/180874 Reviewed-by: CITOOLS <smet-aci-reviews@lists.codex.cro.st.com> Reviewed-by: Yann GAUTIER <yann.gautier@st.com> Tested-by: Yann GAUTIER <yann.gautier@st.com> --- plat/st/common/bl2_io_storage.c | 41 +++++++++++++++++++++++++++++++-- plat/st/stm32mp1/platform.mk | 7 ++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/plat/st/common/bl2_io_storage.c b/plat/st/common/bl2_io_storage.c index 53e0f5f04..14b380a92 100644 --- a/plat/st/common/bl2_io_storage.c +++ b/plat/st/common/bl2_io_storage.c @@ -100,7 +100,7 @@ static io_mtd_dev_spec_t spi_nand_dev_spec = { static const io_dev_connector_t *spi_dev_con; #endif -#if STM32MP_USB_PROGRAMMER +#if STM32MP_UART_PROGRAMMER || STM32MP_USB_PROGRAMMER static const io_dev_connector_t *memmap_dev_con; #endif @@ -266,6 +266,9 @@ static void print_boot_device(boot_api_context_t *boot_context) case BOOT_API_CTX_BOOT_INTERFACE_SEL_FLASH_NAND_QSPI: INFO("Using SPI NAND\n"); break; + case BOOT_API_CTX_BOOT_INTERFACE_SEL_SERIAL_UART: + INFO("Using UART\n"); + break; case BOOT_API_CTX_BOOT_INTERFACE_SEL_SERIAL_USB: INFO("Using USB\n"); break; @@ -513,7 +516,7 @@ static void boot_spi_nand(boot_api_context_t *boot_context) } #endif /* STM32MP_SPI_NAND */ -#if STM32MP_USB_PROGRAMMER +#if STM32MP_UART_PROGRAMMER || STM32MP_USB_PROGRAMMER static void mmap_io_setup(void) { int io_result __unused; @@ -538,7 +541,26 @@ static void stm32image_mmap_setup(void) part->part_offset = 0; part->bkp_offset = 0; } +#endif +#if STM32MP_UART_PROGRAMMER +static void stm32cubeprogrammer_uart(unsigned int image_id) +{ + int ret __unused; + boot_api_context_t *boot_context = + (boot_api_context_t *)stm32mp_get_boot_ctx_address(); + uintptr_t uart_base; + + uart_base = get_uart_address(boot_context->boot_interface_instance); + ret = stm32cubeprog_uart_load(image_id, uart_base, FLASHLAYOUT_BASE, FLASHLAYOUT_SIZE, + DWL_BUFFER_BASE, DWL_BUFFER_SIZE); + assert(ret == 0); + + flush_dcache_range(FLASHLAYOUT_BASE, FLASHLAYOUT_SIZE); +} +#endif + +#if STM32MP_USB_PROGRAMMER static void stm32cubeprogrammer_usb(unsigned int image_id) { usb_handle_t *pdev; @@ -612,8 +634,13 @@ void stm32mp_io_setup(void) stm32image_io_setup(); break; #endif +#if STM32MP_UART_PROGRAMMER || STM32MP_USB_PROGRAMMER +#if STM32MP_UART_PROGRAMMER + case BOOT_API_CTX_BOOT_INTERFACE_SEL_SERIAL_UART: +#endif #if STM32MP_USB_PROGRAMMER case BOOT_API_CTX_BOOT_INTERFACE_SEL_SERIAL_USB: +#endif dmbsy(); mmap_io_setup(); stm32image_mmap_setup(); @@ -633,6 +660,16 @@ int bl2_plat_handle_pre_image_load(unsigned int image_id) (boot_api_context_t *)stm32mp_get_boot_ctx_address(); switch (boot_context->boot_interface_selected) { +#if STM32MP_UART_PROGRAMMER + case BOOT_API_CTX_BOOT_INTERFACE_SEL_SERIAL_UART: + if (image_id == BL33_IMAGE_ID) { + stm32cubeprogrammer_uart(STM32_IMAGE_ID); + /* BL33 at SSBL load address */ + image_block_spec.offset = DWL_BUFFER_BASE; + image_block_spec.length = DWL_BUFFER_SIZE; + } + break; +#endif #if STM32MP_USB_PROGRAMMER case BOOT_API_CTX_BOOT_INTERFACE_SEL_SERIAL_USB: if (image_id == BL33_IMAGE_ID) { diff --git a/plat/st/stm32mp1/platform.mk b/plat/st/stm32mp1/platform.mk index 0894587e7..dfbf24659 100644 --- a/plat/st/stm32mp1/platform.mk +++ b/plat/st/stm32mp1/platform.mk @@ -193,14 +193,17 @@ ifneq ($(filter 1,${STM32MP_RAW_NAND} ${STM32MP_SPI_NAND} ${STM32MP_SPI_NOR}),) BL2_SOURCES += plat/st/stm32mp1/stm32mp1_boot_device.c endif +ifneq ($(filter 1,${STM32MP_UART_PROGRAMMER} ${STM32MP_USB_PROGRAMMER}),) +BL2_SOURCES += drivers/io/io_memmap.c +endif + ifeq (${STM32MP_UART_PROGRAMMER},1) BL2_SOURCES += drivers/st/uart/stm32_uart.c \ plat/st/common/stm32cubeprogrammer_uart.c endif ifeq (${STM32MP_USB_PROGRAMMER},1) -BL2_SOURCES += drivers/io/io_memmap.c \ - drivers/st/usb_dwc2/usb_dwc2.c \ +BL2_SOURCES += drivers/st/usb_dwc2/usb_dwc2.c \ lib/usb/usb_core.c \ lib/usb/usb_st_dfu.c \ plat/st/common/stm32cubeprogrammer_usb.c \ -- GitLab