diff --git a/plat/st/common/bl2_io_storage.c b/plat/st/common/bl2_io_storage.c index 53e0f5f041022ff976ccfa8173fbc9e80ea34f25..14b380a925e6d6ee41ffc51eae9410639547dbc7 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 0894587e77f21aa6cd5bbf7561b51f0f25152ab1..dfbf2465968c01342d039aaaeffdc00c2b2cd480 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 \