bbu_mmcboot_handler() already takes care to switch $mmc.boot to the freshly read inactive partition. On some SoCs like the STM32MP1, this is not enough, but the boot ack bit must be set as well, so the BootROM can communicate with the eMMC. Have this happen as part of the eMMC boot switch after a successful update if bbu_data::flags has BBU_FLAG_MMC_BOOT_ACK set. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- common/bbu.c | 17 ++++++++++++++++- include/bbu.h | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/common/bbu.c b/common/bbu.c index 4d92d70ff9e3..26b997c02ed1 100644 --- a/common/bbu.c +++ b/common/bbu.c @@ -310,7 +310,7 @@ int bbu_mmcboot_handler(struct bbu_handler *handler, struct bbu_data *data, { struct bbu_data _data = *data; int ret; - char *devicefile = NULL, *bootpartvar = NULL; + char *devicefile = NULL, *bootpartvar = NULL, *bootackvar = NULL; const char *bootpart; const char *devname = devpath_to_name(data->devicefile); @@ -346,10 +346,25 @@ int bbu_mmcboot_handler(struct bbu_handler *handler, struct bbu_data *data, if (ret < 0) goto out; + /* + * This flag can be set in the chained handler or by + * bbu_mmcboot_handler's caller + */ + if ((_data.flags | data->flags) & BBU_FLAG_MMC_BOOT_ACK) { + ret = asprintf(&bootackvar, "%s.boot_ack", devname); + if (ret < 0) + goto out; + + ret = setenv(bootackvar, "1"); + if (ret) + goto out; + } + /* on success switch boot source */ ret = setenv(bootpartvar, bootpart); out: + free(bootackvar); free(devicefile); free(bootpartvar); diff --git a/include/bbu.h b/include/bbu.h index bf5f2158df72..bd19fa187faf 100644 --- a/include/bbu.h +++ b/include/bbu.h @@ -10,6 +10,7 @@ struct bbu_data { #define BBU_FLAG_FORCE (1 << 0) #define BBU_FLAG_YES (1 << 1) +#define BBU_FLAG_MMC_BOOT_ACK (1 << 2) unsigned long flags; int force; const void *image; -- 2.30.2 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox