From patchwork Tue Apr 21 07:28:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Roese X-Patchwork-Id: 238184 List-Id: U-Boot discussion From: sr at denx.de (Stefan Roese) Date: Tue, 21 Apr 2020 09:28:46 +0200 Subject: [PATCH 22/26 v7] mips: spl: Flush cache before jumping to U-Boot proper In-Reply-To: <20200421072850.4970-1-sr@denx.de> References: <20200421072850.4970-1-sr@denx.de> Message-ID: <20200421072850.4970-23-sr@denx.de> This patch adds a MIPS specific jump_to_image_no_args() implementation, which flushes the U-Boot proper image loaded from the boot device in SPL before jumping to it. It has been noticed on MT76x8, that this cache flush is needed. Other MIPS platforms might need it as well. Signed-off-by: Stefan Roese Cc: Weijie Gao Cc: Daniel Schwierzeck Cc: Simon Goldschmidt Reviewed-by: Daniel Schwierzeck --- Changes in v7: - Moved to MIPS specific file as suggested by Daniel Changes in v6: - New patch arch/mips/lib/Makefile | 1 + arch/mips/lib/spl.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 arch/mips/lib/spl.c diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile index 24a72d9c97..9ee1fcb5c7 100644 --- a/arch/mips/lib/Makefile +++ b/arch/mips/lib/Makefile @@ -12,5 +12,6 @@ obj-y += traps.o obj-$(CONFIG_CMD_BOOTM) += bootm.o obj-$(CONFIG_CMD_GO) += boot.o +obj-$(CONFIG_SPL_BUILD) += spl.o lib-$(CONFIG_USE_PRIVATE_LIBGCC) += ashldi3.o ashrdi3.o lshrdi3.o diff --git a/arch/mips/lib/spl.c b/arch/mips/lib/spl.c new file mode 100644 index 0000000000..7ba3e53f6d --- /dev/null +++ b/arch/mips/lib/spl.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2020 Stefan Roese + */ + +#include +#include +#include + +void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image) +{ + typedef void __noreturn (*image_entry_noargs_t)(void); + image_entry_noargs_t image_entry = + (image_entry_noargs_t)spl_image->entry_point; + + /* Flush cache before jumping to application */ + flush_cache((unsigned long)spl_image->load_addr, spl_image->size); + + debug("image entry point: 0x%lx\n", spl_image->entry_point); + image_entry(); +}