Hi Daniel,
On 13.02.20 07:04, Stefan Roese wrote:
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 <[email protected]>
Reviewed-by: Daniel Schwierzeck <[email protected]>
Tested-by: Mauro Condarelli <[email protected]>
Cc: Daniel Schwierzeck <[email protected]>
Cc: Mauro Condarelli <[email protected]>
Cc: Weijie Gao <[email protected]>
Just checking. What is the status of this patch? I don't see it in your
"next" branch.
Thanks,
Stefan
---
v3:
- Use gd->ram_top instead of gd->bd->bi_memsize for memory size
calculation as suggested by Daniel
v2:
- Moved cache flush into weak do_go_exec() to make this changed
mips only
arch/mips/lib/Makefile | 1 +
arch/mips/lib/boot.c | 23 +++++++++++++++++++++++
2 files changed, 24 insertions(+)
create mode 100644 arch/mips/lib/boot.c
diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile
index 589bc651f9..24a72d9c97 100644
--- a/arch/mips/lib/Makefile
+++ b/arch/mips/lib/Makefile
@@ -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
index 0000000000..db862f6379
--- /dev/null
+++ b/arch/mips/lib/boot.c
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2020 Stefan Roese <[email protected]>
+ */
+
+#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);
+}
Viele Grüße,
Stefan
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: [email protected]