Am 20.05.19 um 17:22 schrieb Stefan Roese:
> With commit 06985289d452 ("watchdog: Implement generic watchdog_reset()
> version") the init sequence has changed in arch_misc_init(), resulting
> in a re-appearance of the d-cache issue on MT7688 boards (e.g. gardena).
> When this happens, the first (or sometimes later ones as well) TFTP
> command hangs and does not complete correctly. This leads to the
> assumption that the d-cache is not in a clean state once the ethernet
> driver is called (d-cache is used here for the buffers). The old work-
> around with the cache flush somehow does not work any more now with
> the new code change.
> 
> Testing has shown, that copying a 64KiB area in DDR at a very late
> bootup time, directly before calling into the prompt, fixes this issue.
> Flushing of the complete d-cache does not seem to necessary, as this
> copy alone seems to fix this problem.
> 
> Signed-off-by: Stefan Roese <s...@denx.de>
> Cc: Daniel Schwierzeck <daniel.schwierz...@gmail.com>
> ---
>  arch/mips/Kconfig           |  2 +-
>  arch/mips/mach-mtmips/cpu.c | 21 ++++++++++++++++-----
>  2 files changed, 17 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> index 9cf8e9800d..e3e7945567 100644
> --- a/arch/mips/Kconfig
> +++ b/arch/mips/Kconfig
> @@ -84,7 +84,7 @@ config ARCH_MTMIPS
>       select DM_SERIAL
>       imply DM_SPI
>       imply DM_SPI_FLASH
> -     select ARCH_MISC_INIT
> +     select LAST_STAGE_INIT
>       select MIPS_TUNE_24KC
>       select OF_CONTROL
>       select ROM_EXCEPTION_VECTORS
> diff --git a/arch/mips/mach-mtmips/cpu.c b/arch/mips/mach-mtmips/cpu.c
> index fcd0484a6d..7afc2c5940 100644
> --- a/arch/mips/mach-mtmips/cpu.c
> +++ b/arch/mips/mach-mtmips/cpu.c
> @@ -69,17 +69,28 @@ int print_cpuinfo(void)
>       return 0;
>  }
>  
> -int arch_misc_init(void)
> +int last_stage_init(void)
>  {
> +     void *src, *dst;
> +
> +     src = malloc(SZ_64K);
> +     dst = malloc(SZ_64K);
> +     if (!src || !dst) {
> +             printf("Can't allocate buffer for cache cleanup copy!\n");
> +             return 0;
> +     }
> +
>       /*
>        * It has been noticed, that sometimes the d-cache is not in a
>        * "clean-state" when U-Boot is running on MT7688. This was
>        * detected when using the ethernet driver (which uses d-cache)
> -      * and a TFTP command does not complete. Flushing the complete
> -      * d-cache (again?) here seems to fix this issue.
> +      * and a TFTP command does not complete. Copying an area of 64KiB
> +      * in DDR at a very late bootup time in U-Boot, directly before
> +      * calling into the prompt, seems to fix this issue.
>        */
> -     flush_dcache_range(gd->bd->bi_memstart,
> -                        gd->bd->bi_memstart + gd->ram_size - 1);
> +     memcpy(dst, src, SZ_64K);
> +     free(src);
> +     free(dst);
>  
>       return 0;
>  }
> 

have you also tried with CONFIG_SYS_MALLOC_CLEAR_ON_INIT? This will run
a memset on the whole malloc area in mem_malloc_init(). This would also
cause a cache line update for all heap memory. May this helps too and
this ugly workaround can go away ;)

-- 
- Daniel
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to