diff mbox series

[RFC,3/3] mips: spl: Flush cache before jumping to U-Boot proper

Message ID 20200410110431.12256-3-sr@denx.de
State New
Headers show
Series [RFC,1/3] spl: spl_nor: Move legacy image loading into spl_legacy.c | expand

Commit Message

Stefan Roese April 10, 2020, 11:04 a.m. UTC
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 <sr at denx.de>
Cc: Weijie Gao <weijie.gao at mediatek.com>
Cc: Daniel Schwierzeck <daniel.schwierzeck at gmail.com>
Cc: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>
---
 arch/mips/lib/boot.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

Comments

Daniel Schwierzeck April 15, 2020, 11:43 a.m. UTC | #1
Am 10.04.20 um 13:04 schrieb Stefan Roese:
> 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 <sr at denx.de>
> Cc: Weijie Gao <weijie.gao at mediatek.com>
> Cc: Daniel Schwierzeck <daniel.schwierzeck at gmail.com>
> Cc: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>
> ---
>  arch/mips/lib/boot.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/arch/mips/lib/boot.c b/arch/mips/lib/boot.c
> index db862f6379..bc620abd9b 100644
> --- a/arch/mips/lib/boot.c
> +++ b/arch/mips/lib/boot.c
> @@ -6,6 +6,7 @@
>  #include <common.h>
>  #include <command.h>
>  #include <cpu_func.h>
> +#include <spl.h>
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> @@ -21,3 +22,16 @@ unsigned long do_go_exec(ulong (*entry)(int, char * const []),
>  
>  	return entry(argc, argv);
>  }
> +
> +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();
> +}
> 

the function itself looks good. But arch/mips/lib/boot.c depends on
CONFIG_CMD_GO (from Makefile: obj-$(CONFIG_CMD_GO) += boot.o)

I think it's better if we establish an arch/mips/lib/spl.c for generic
but MIPS specific SPL stuff and wrap it with CONFIG_SPL_BUILD.
Stefan Roese April 15, 2020, 12:14 p.m. UTC | #2
On 15.04.20 13:43, Daniel Schwierzeck wrote:
> 
> 
> Am 10.04.20 um 13:04 schrieb Stefan Roese:
>> 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 <sr at denx.de>
>> Cc: Weijie Gao <weijie.gao at mediatek.com>
>> Cc: Daniel Schwierzeck <daniel.schwierzeck at gmail.com>
>> Cc: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>
>> ---
>>   arch/mips/lib/boot.c | 14 ++++++++++++++
>>   1 file changed, 14 insertions(+)
>>
>> diff --git a/arch/mips/lib/boot.c b/arch/mips/lib/boot.c
>> index db862f6379..bc620abd9b 100644
>> --- a/arch/mips/lib/boot.c
>> +++ b/arch/mips/lib/boot.c
>> @@ -6,6 +6,7 @@
>>   #include <common.h>
>>   #include <command.h>
>>   #include <cpu_func.h>
>> +#include <spl.h>
>>   
>>   DECLARE_GLOBAL_DATA_PTR;
>>   
>> @@ -21,3 +22,16 @@ unsigned long do_go_exec(ulong (*entry)(int, char * const []),
>>   
>>   	return entry(argc, argv);
>>   }
>> +
>> +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();
>> +}
>>
> 
> the function itself looks good. But arch/mips/lib/boot.c depends on
> CONFIG_CMD_GO (from Makefile: obj-$(CONFIG_CMD_GO) += boot.o)
> 
> I think it's better if we establish an arch/mips/lib/spl.c for generic
> but MIPS specific SPL stuff and wrap it with CONFIG_SPL_BUILD.

Yes, makes sense. I'll make this change in v7 of the patchset.

Thanks,
Stefan
diff mbox series

Patch

diff --git a/arch/mips/lib/boot.c b/arch/mips/lib/boot.c
index db862f6379..bc620abd9b 100644
--- a/arch/mips/lib/boot.c
+++ b/arch/mips/lib/boot.c
@@ -6,6 +6,7 @@ 
 #include <common.h>
 #include <command.h>
 #include <cpu_func.h>
+#include <spl.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -21,3 +22,16 @@  unsigned long do_go_exec(ulong (*entry)(int, char * const []),
 
 	return entry(argc, argv);
 }
+
+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();
+}