]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
mips: cmd: go: Flush cache before jumping to app/image
authorStefan Roese <sr@denx.de>
Thu, 13 Feb 2020 06:04:00 +0000 (07:04 +0100)
committerDaniel Schwierzeck <daniel.schwierzeck@gmail.com>
Thu, 9 Apr 2020 17:00:00 +0000 (19:00 +0200)
It has been noticed on MT7628/88 platforms, that booting the RAM image
does not work reliably. Sometimes it works and sometimes not. Debugging
showed that this "might" be a cache related issue as very strange
errors occurred (e.g. output corrupted etc).

This patch adds a cache flush for the complete SDRAM area to the go cmd
before jumping to the entry point for the MIPS architecture. The
complete area is flushed as we don't know at this point, how big the
area of the "application" really is.

Signed-off-by: Stefan Roese <sr@denx.de>
Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Tested-by: Mauro Condarelli <mc5686@mclink.it>
Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Cc: Mauro Condarelli <mc5686@mclink.it>
Cc: Weijie Gao <weijie.gao@mediatek.com>
arch/mips/lib/Makefile
arch/mips/lib/boot.c [new file with mode: 0644]

index 589bc651f94166aa538d4304bc96182f3c477903..24a72d9c973966a522fa73aa0c0cad421caf0853 100644 (file)
@@ -11,5 +11,6 @@ obj-y += stack.o
 obj-y  += traps.o
 
 obj-$(CONFIG_CMD_BOOTM) += bootm.o
+obj-$(CONFIG_CMD_GO) += boot.o
 
 lib-$(CONFIG_USE_PRIVATE_LIBGCC) += ashldi3.o ashrdi3.o lshrdi3.o
diff --git a/arch/mips/lib/boot.c b/arch/mips/lib/boot.c
new file mode 100644 (file)
index 0000000..db862f6
--- /dev/null
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2020 Stefan Roese <sr@denx.de>
+ */
+
+#include <common.h>
+#include <command.h>
+#include <cpu_func.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+unsigned long do_go_exec(ulong (*entry)(int, char * const []),
+                        int argc, char * const argv[])
+{
+       /*
+        * Flush cache before jumping to application. Let's flush the
+        * whole SDRAM area, since we don't know the size of the image
+        * that was loaded.
+        */
+       flush_cache(gd->bd->bi_memstart, gd->ram_top - gd->bd->bi_memstart);
+
+       return entry(argc, argv);
+}