On 9/14/26 8:35 AM, Carlo Caione wrote: > From: Julien Masson <[email protected]> > > Genio 510 and 700 need a provisioning and recovery path that remains > usable when eMMC is blank or its boot firmware is unusable. Add a RAM- > based fastboot download agent so boards can be flashed through the > MediaTek BootROM download protocol without a working on-device > bootloader. > > Running the agent in SPL avoids a dependency on BL31 and U-Boot proper > during provisioning.
It would be helpful to have some more explanation here about why the different parts of this patch are doing what they are doing. > > Signed-off-by: Julien Masson <[email protected]> > Signed-off-by: Carlo Caione <[email protected]> > --- > arch/arm/dts/mt8188-genio-da-u-boot.dtsi | 55 ++++++++++++++++++ > arch/arm/dts/mt8370-genio-510-evk-u-boot.dtsi | 4 ++ > arch/arm/dts/mt8390-genio-700-evk-u-boot.dtsi | 4 ++ > arch/arm/dts/mtk-genio-da-binman-u-boot.dtsi | 16 ++++++ > .../dts/mtk-genio-loader-spl-binman-u-boot.dtsi | 6 ++ > arch/arm/mach-mediatek/Kconfig | 26 +++++++++ > arch/arm/mach-mediatek/Makefile | 1 + > arch/arm/mach-mediatek/spl_fastboot.c | 65 > ++++++++++++++++++++++ > board/mediatek/MAINTAINERS | 5 ++ > common/spl/Kconfig | 2 +- > configs/mt8188-genio-da-spl-fastboot.config | 15 +++++ > configs/mt8188-genio-da.config | 19 +++++++ I think these should use mt8370 prefix like the other common genio 510/700 stuff. mt8188 is for chromebooks, so I don't think it would make sense to use that number with genio-specific configs. > configs/mt8370_genio_510_evk_da_spl_defconfig | 2 + > configs/mt8390_genio_700_evk_da_spl_defconfig | 2 + > 14 files changed, 221 insertions(+), 1 deletion(-) > > diff --git a/arch/arm/dts/mt8188-genio-da-u-boot.dtsi > b/arch/arm/dts/mt8188-genio-da-u-boot.dtsi > new file mode 100644 > index 00000000000..e9078f37157 > --- /dev/null > +++ b/arch/arm/dts/mt8188-genio-da-u-boot.dtsi > @@ -0,0 +1,55 @@ > +// SPDX-License-Identifier: (GPL-2.0-only OR MIT) > +/* > + * Copyright (c) 2026 BayLibre, SAS. > + * Author: Carlo Caione <[email protected]> > + */ I would add a comment here explaining that da is download agent and why we have this special devicetree that is different from the normal one. > + > +#include "mtk-genio-binman-u-boot.dtsi" > +#include "mtk-genio-da-binman-u-boot.dtsi" > + > +&ssusb0 { > + dr_mode = "peripheral"; > + mediatek,force-vbus; This is not an upstream DT property. It seems like dr_mode = "peripheral" should already imply this anyway. So hopefully we can just modify the USB driver and leave this property out. > +}; > + > +&ssusb1 { > + status = "disabled"; > +}; > + > +&ssusb2 { > + status = "disabled"; > +}; > + > +#ifdef CONFIG_MTK_BROM_DOWNLOAD_AGENT_SPL_FASTBOOT Why do these matter for fastboot but not the ones above? > +&pericfg_ao { > + bootph-pre-ram; > +}; > + > +&ssusb0 { > + bootph-pre-ram; > +}; > + > +&u3phy0 { > + bootph-pre-ram; > +}; > + > +&u2port0 { > + bootph-pre-ram; > +}; > + > +&usb_default_pins { > + bootph-pre-ram; > + > + pins-iddig { > + bootph-pre-ram; > + }; > + > + pins-valid { > + bootph-pre-ram; > + }; > + > + pins-vbus { > + bootph-pre-ram; > + }; > +}; > +#endif > diff --git a/arch/arm/dts/mt8370-genio-510-evk-u-boot.dtsi > b/arch/arm/dts/mt8370-genio-510-evk-u-boot.dtsi > index 10b9a142f37..608987ca6d7 100644 > --- a/arch/arm/dts/mt8370-genio-510-evk-u-boot.dtsi > +++ b/arch/arm/dts/mt8370-genio-510-evk-u-boot.dtsi > @@ -14,3 +14,7 @@ > #include "mtk-genio-mtk-boot-binman-u-boot.dtsi" > #include "mtk-genio-bootloaders-binman-u-boot.dtsi" > #endif > + > +#ifdef CONFIG_MTK_BROM_DOWNLOAD_AGENT > +#include "mt8188-genio-da-u-boot.dtsi" > +#endif > diff --git a/arch/arm/dts/mt8390-genio-700-evk-u-boot.dtsi > b/arch/arm/dts/mt8390-genio-700-evk-u-boot.dtsi > index 6230b016ca0..6c6c85e8767 100644 > --- a/arch/arm/dts/mt8390-genio-700-evk-u-boot.dtsi > +++ b/arch/arm/dts/mt8390-genio-700-evk-u-boot.dtsi > @@ -14,3 +14,7 @@ > #include "mtk-genio-mtk-boot-binman-u-boot.dtsi" > #include "mtk-genio-bootloaders-binman-u-boot.dtsi" > #endif > + > +#ifdef CONFIG_MTK_BROM_DOWNLOAD_AGENT > +#include "mt8188-genio-da-u-boot.dtsi" > +#endif > diff --git a/arch/arm/dts/mtk-genio-da-binman-u-boot.dtsi > b/arch/arm/dts/mtk-genio-da-binman-u-boot.dtsi > new file mode 100644 > index 00000000000..ad337bf1784 > --- /dev/null > +++ b/arch/arm/dts/mtk-genio-da-binman-u-boot.dtsi > @@ -0,0 +1,16 @@ > +// SPDX-License-Identifier: (GPL-2.0-only OR MIT) > +/* > + * Copyright (c) 2026 BayLibre, SAS. > + * Author: Carlo Caione <[email protected]> > + */ > + > +&binman { > + da: da { > + filename = "da.bin"; > + pad-byte = <0>; > + > +#define MTK_GENIO_SIMPLE_SPL Could we pick a name that describe more precicly what this does? SIMPLE is vague. > +#include "mtk-genio-loader-spl-binman-u-boot.dtsi" > +#undef MTK_GENIO_SIMPLE_SPL > + }; > +}; > diff --git a/arch/arm/dts/mtk-genio-loader-spl-binman-u-boot.dtsi > b/arch/arm/dts/mtk-genio-loader-spl-binman-u-boot.dtsi > index 2dd13d261a0..503ae06da34 100644 > --- a/arch/arm/dts/mtk-genio-loader-spl-binman-u-boot.dtsi > +++ b/arch/arm/dts/mtk-genio-loader-spl-binman-u-boot.dtsi > @@ -12,6 +12,11 @@ ddr-loader { > size = <CONFIG_MTK_GENIO_DDR_LOADER_SIZE>; > }; > > +#ifdef MTK_GENIO_SIMPLE_SPL > +u-boot-spl { > + size = <CONFIG_SPL_MAX_SIZE>; > +}; > +#else > #ifdef CONFIG_SPL_FIT_SIGNATURE > u-boot-spl { > type = "section"; > @@ -31,3 +36,4 @@ u-boot-spl { > size = <CONFIG_SPL_MAX_SIZE>; > }; > #endif > +#endif > diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig > index e572cfe8571..59489c0fe65 100644 > --- a/arch/arm/mach-mediatek/Kconfig > +++ b/arch/arm/mach-mediatek/Kconfig > @@ -249,6 +249,32 @@ config MTK_GENIO_BL31_LOAD_ADDR > > endif > > +config MTK_BROM_DOWNLOAD_AGENT > + bool > + depends on TARGET_MT8188 && SPL > + select BINMAN > + select MTK_GENIO_IMAGE_CONTRACT > + > +choice > + prompt "MediaTek BootROM download agent" > + optional > + depends on TARGET_MT8188 && SPL && SUPPORT_EMMC_BOOT > + help > + Select where to run fastboot after the BootROM downloads the agent > + into RAM. Leave this disabled for normal storage boot. > + > +config MTK_BROM_DOWNLOAD_AGENT_SPL_FASTBOOT > + bool "Run download-agent fastboot from SPL" > + depends on SPL_FASTBOOT_FLASH_MMC > + select MTK_BROM_DOWNLOAD_AGENT > + select SPL_BOARD_INIT > + help > + Build an SPL which enters USB fastboot after the MediaTek BootROM > + downloads it into RAM. The download agent also configures the eMMC > + boot partition so that a newly flashed board can boot normally. > + > +endchoice > + > config MTK_TZ_MOVABLE > select ARCH_MISC_INIT > select OF_SYSTEM_SETUP > diff --git a/arch/arm/mach-mediatek/Makefile b/arch/arm/mach-mediatek/Makefile > index 35f748a70d6..42b83b82f77 100644 > --- a/arch/arm/mach-mediatek/Makefile > +++ b/arch/arm/mach-mediatek/Makefile > @@ -4,6 +4,7 @@ obj-$(CONFIG_ARM64) += armv8-mem-map.o > obj-y += cpu.o > obj-$(CONFIG_MTK_TZ_MOVABLE) += tzcfg.o > obj-$(CONFIG_XPL_BUILD) += spl.o > +obj-$(CONFIG_MTK_BROM_DOWNLOAD_AGENT_SPL_FASTBOOT) += spl_fastboot.o > > obj-$(CONFIG_TARGET_MT7622) += mt7622/ > obj-$(CONFIG_TARGET_MT7623) += mt7623/ > diff --git a/arch/arm/mach-mediatek/spl_fastboot.c > b/arch/arm/mach-mediatek/spl_fastboot.c > new file mode 100644 > index 00000000000..0ba76d47dfb > --- /dev/null > +++ b/arch/arm/mach-mediatek/spl_fastboot.c > @@ -0,0 +1,65 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Copyright (c) 2024 BayLibre, SAS. 2026 > + * Author: Julien Masson <[email protected]> > + */ > + > +#include <dm/uclass.h> > +#include <fastboot.h> > +#include <mmc.h> Suggest also <stdio.h> for printf and <linux/errno.h> for ENODEV. > + > +static int mtk_mmc_boot_prepare(void) > +{ > + struct udevice *dev; > + struct mmc *mmc; > + int ret; > + > + ret = uclass_get_device_by_seq(UCLASS_MMC, > + CONFIG_FASTBOOT_FLASH_MMC_DEV, &dev); Should this be find_mmc_device(CONFIG_VAL(FASTBOOT_FLASH_MMC_DEV))? > + if (ret) { > + printf("Cannot load MMC device: %d\n", ret); > + return ret; > + } > + > + mmc = mmc_get_mmc_dev(dev); > + if (!mmc) > + return -ENODEV; > + > + ret = mmc_init(mmc); > + if (ret) { > + printf("MMC init failed: %d\n", ret); > + return ret; > + } > + > + /* Enable BOOT1 and boot acknowledgment for normal BootROM startup. */ > + ret = mmc_set_part_conf(mmc, 1, 1, 0); > + if (ret) > + printf("Cannot configure the eMMC boot partition: %d\n", ret); > + > + /* Reset to x1 SDR, backward-compatible timing for each boot. */ > + ret = mmc_set_boot_bus_width(mmc, 0, 0, 0); > + if (ret) > + printf("Cannot configure the eMMC boot bus: %d\n", ret); > + > + if (!mmc->ext_csd[EXT_CSD_RST_N_FUNCTION]) { > + ret = mmc_set_rst_n_function(mmc, 1); > + if (ret) > + printf("Cannot enable the eMMC reset function: %d\n", > ret); > + } > + > + return 0; > +} > + > +void spl_board_init(void) > +{ > + int ret; > + > + ret = mtk_mmc_boot_prepare(); > + if (ret) > + printf("MMC boot preparation failed: %d\n", ret); > + > + puts("Waiting for fastboot commands...\n"); > + ret = fastboot_usb_run(CONFIG_FASTBOOT_USB_DEV, NULL, 0); > + if (ret) > + printf("Fastboot failed: %d\n", ret); > +} > diff --git a/board/mediatek/MAINTAINERS b/board/mediatek/MAINTAINERS > index 5b0d79320bd..27aeb4dff07 100644 > --- a/board/mediatek/MAINTAINERS > +++ b/board/mediatek/MAINTAINERS > @@ -21,14 +21,19 @@ MT8188/MT8370/MT8390 > M: Macpaul Lin <[email protected]> > M: Julien Stephan <[email protected]> > S: Maintained > +F: arch/arm/dts/mt8188-genio-da-u-boot.dtsi > F: arch/arm/dts/mt8188-u-boot.dtsi > F: arch/arm/dts/mt8370-genio-510-evk-u-boot.dtsi > F: arch/arm/dts/mt8390-genio-700-evk-u-boot.dtsi > F: arch/arm/dts/mt8390-genio-common-u-boot.dtsi > F: arch/arm/dts/mtk-genio-*-binman-u-boot.dtsi > F: arch/arm/dts/mtk-genio-binman-u-boot.dtsi > +F: configs/mt8188-genio-da-spl-fastboot.config > +F: configs/mt8188-genio-da.config > F: configs/mt8188.config > +F: configs/mt8370_genio_510_evk_da_spl_defconfig > F: configs/mt8370_genio_510_evk_defconfig > +F: configs/mt8390_genio_700_evk_da_spl_defconfig > F: configs/mt8390_genio_700_evk_defconfig > F: doc/board/mediatek/mt8188-genio-evk.rst > > diff --git a/common/spl/Kconfig b/common/spl/Kconfig > index f9b453df766..77da2f4c8aa 100644 > --- a/common/spl/Kconfig > +++ b/common/spl/Kconfig > @@ -194,7 +194,7 @@ config SPL_SHOW_ERRORS > config SPL_BINMAN_SYMBOLS > bool "Declare binman symbols in SPL" > depends on SPL_FRAMEWORK && BINMAN > - default n if MTK_GENIO_BOOT_IMAGES > + default n if MTK_GENIO_IMAGE_CONTRACT Should we do something to make sure we don't select MTK_GENIO_BOOT_IMAGES and MTK_BROM_DOWNLOAD_AGENT at the same time? > default y > help > This enables use of symbols in SPL which refer to other entries in > diff --git a/configs/mt8188-genio-da-spl-fastboot.config > b/configs/mt8188-genio-da-spl-fastboot.config > new file mode 100644 > index 00000000000..01b35f1144e > --- /dev/null > +++ b/configs/mt8188-genio-da-spl-fastboot.config > @@ -0,0 +1,15 @@ > +#include <configs/mt8188-genio-da.config> > + > +CONFIG_MTK_BROM_DOWNLOAD_AGENT_SPL_FASTBOOT=y > +# Sparse writes need an 8 MiB DMA buffer in addition to the fastboot state. > +CONFIG_SPL_SYS_MALLOC_SIZE=0x1000000 > +CONFIG_SPL_MMC_WRITE=y > +CONFIG_SPL_PHY=y > +CONFIG_SPL_DM_USB_GADGET=y > +CONFIG_SPL_USB_GADGET=y > +CONFIG_SPL_USB_MTU3=y > +CONFIG_SPL_FASTBOOT=y > +CONFIG_SPL_FASTBOOT_REBOOT=y > +CONFIG_SPL_FASTBOOT_FLASH_MMC=y > +CONFIG_SPL_FASTBOOT_MMC_BOOT_SUPPORT=y > +CONFIG_SPL_FASTBOOT_MMC_USER_SUPPORT=y > diff --git a/configs/mt8188-genio-da.config b/configs/mt8188-genio-da.config Do these really need to be two separate files? As mentioned above, there isn't really such thing as a mt8188-genio seprate from a mt8370-genio-common. mt8188.config already contains things that really are genio-specific that would be more "correct" to move to a separate file. But that is a bigger cleanup that affects all MediaTek Genio boards that we can look at later. > new file mode 100644 > index 00000000000..d47bce044a7 > --- /dev/null > +++ b/configs/mt8188-genio-da.config > @@ -0,0 +1,19 @@ > +CONFIG_SYS_MALLOC_LEN=0x9000000 > +CONFIG_SUPPORT_EMMC_BOOT=y > +CONFIG_PHY=y > +CONFIG_PHY_MTK_TPHY=y > +CONFIG_USB=y > +CONFIG_DM_USB_GADGET=y > +CONFIG_USB_MTU3=y > +CONFIG_USB_GADGET=y > +CONFIG_USB_GADGET_VENDOR_NUM=0x0e8d > +CONFIG_USB_GADGET_PRODUCT_NUM=0x201c > +CONFIG_CMD_FASTBOOT=y > +CONFIG_USB_FUNCTION_FASTBOOT=y > +CONFIG_FASTBOOT_BUF_ADDR=0x65000000 > +CONFIG_FASTBOOT_BUF_SIZE=0x15000000 > +CONFIG_FASTBOOT_FLASH=y > +CONFIG_FASTBOOT_FLASH_MMC=y > +CONFIG_FASTBOOT_FLASH_MMC_DEV=0 > +CONFIG_FASTBOOT_MMC_BOOT_SUPPORT=y > +CONFIG_FASTBOOT_MMC_USER_SUPPORT=y > diff --git a/configs/mt8370_genio_510_evk_da_spl_defconfig > b/configs/mt8370_genio_510_evk_da_spl_defconfig > new file mode 100644 > index 00000000000..42ca29dfe1c > --- /dev/null > +++ b/configs/mt8370_genio_510_evk_da_spl_defconfig > @@ -0,0 +1,2 @@ > +#include <configs/mt8370_genio_510_evk_defconfig> > +#include <configs/mt8188-genio-da-spl-fastboot.config> > diff --git a/configs/mt8390_genio_700_evk_da_spl_defconfig > b/configs/mt8390_genio_700_evk_da_spl_defconfig > new file mode 100644 > index 00000000000..ca58b131ed6 > --- /dev/null > +++ b/configs/mt8390_genio_700_evk_da_spl_defconfig > @@ -0,0 +1,2 @@ > +#include <configs/mt8390_genio_700_evk_defconfig> > +#include <configs/mt8188-genio-da-spl-fastboot.config> >
