Genio SPL runs fastboot with the MMU and CPU caches disabled, making image downloads about twice as slow as with the U-Boot-proper agent. Enable caching to remove this provisioning bottleneck.
Keep the page tables clear of images loaded after fastboot continue, and clean up the CPU caches and MMU before handing off to the next stage. Signed-off-by: Carlo Caione <[email protected]> --- arch/arm/mach-mediatek/download_agent.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/arch/arm/mach-mediatek/download_agent.c b/arch/arm/mach-mediatek/download_agent.c index 193817cce98..2330180846a 100644 --- a/arch/arm/mach-mediatek/download_agent.c +++ b/arch/arm/mach-mediatek/download_agent.c @@ -4,13 +4,20 @@ * Author: Julien Masson <[email protected]> */ +#include <cpu_func.h> #include <dm/uclass.h> #include <fastboot.h> #include <init.h> +#include <malloc.h> #include <mmc.h> #include <spl.h> #include <stdio.h> +#include <asm/global_data.h> +#include <asm/system.h> #include <linux/errno.h> +#include <linux/sizes.h> + +DECLARE_GLOBAL_DATA_PTR; static int mtk_mmc_boot_prepare(void) { @@ -61,6 +68,19 @@ void spl_board_init(void) { int ret; + if (!CONFIG_IS_ENABLED(SYS_DCACHE_OFF)) { + /* The heap stays clear of the images loaded after fastboot. */ + gd->arch.tlb_size = PGTABLE_SIZE; + gd->arch.tlb_addr = (ulong)memalign(SZ_64K, gd->arch.tlb_size); + if (gd->arch.tlb_addr) { + /* SPL skips arch_cpu_init(), which enables the I-cache. */ + icache_enable(); + dcache_enable(); + } else { + puts("Cannot allocate page tables; running uncached\n"); + } + } + ret = mtk_mmc_boot_prepare(); if (ret) printf("MMC boot preparation failed: %d\n", ret); @@ -70,6 +90,12 @@ void spl_board_init(void) if (ret) printf("Fastboot failed: %d\n", ret); } + +void spl_board_prepare_for_boot(void) +{ + if (!CONFIG_IS_ENABLED(SYS_DCACHE_OFF)) + cleanup_before_linux(); +} #else int board_late_init(void) { -- 2.56.0
