[PATCH v3] mips: cmd: go: Flush cache before jumping to app/image

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 --- 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 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); +}

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 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
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 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);
+}
Viele Grüße, Stefan

Hi Stefan,
Am 06.04.20 um 12:06 schrieb Stefan Roese:
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 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
Just checking. What is the status of this patch? I don't see it in your "next" branch.
sorry for the inactivity, but for the last six weeks I was quite busy with business travel and day job. I'll rebuild the next branch and go through patchwork when the merge window opens. I guess it's to late for 2020.04 to squeeze some fixes in ;)

Hi Daniel,
On 06.04.20 12:47, Daniel Schwierzeck wrote:
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 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
Just checking. What is the status of this patch? I don't see it in your "next" branch.
sorry for the inactivity, but for the last six weeks I was quite busy with business travel and day job.
No problem. I was just checking. ;)
I'll rebuild the next branch and go through patchwork when the merge window opens. I guess it's to late for 2020.04 to squeeze some fixes in ;)
I don't have a hard need for this patch in the upcoming 2020.04 release. So feel free to include it in the next merge window instead.
Thanks, Stefan

Am 13.02.20 um 07:04 schrieb Stefan Roese:
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
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
applied to u-boot-mips/next, thanks.
participants (2)
-
Daniel Schwierzeck
-
Stefan Roese