Skip to content
Snippets Groups Projects
Commit 4d24a11e authored by Simon Glass's avatar Simon Glass
Browse files

arm: Allow cleanup_before_linux() without disabling caches


This function is used before jumping to U-Boot, but in that case we don't
always want to disable caches.

Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
Signed-off-by: default avatarVadim Bendebury <vbendeb@chromium.org>
parent 32ba8952
No related branches found
No related tags found
No related merge requests found
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
void __weak cpu_cache_initialization(void){} void __weak cpu_cache_initialization(void){}
int cleanup_before_linux(void) int cleanup_before_linux_select(int flags)
{ {
/* /*
* this function is called just before we call linux * this function is called just before we call linux
...@@ -42,24 +42,30 @@ int cleanup_before_linux(void) ...@@ -42,24 +42,30 @@ int cleanup_before_linux(void)
icache_disable(); icache_disable();
invalidate_icache_all(); invalidate_icache_all();
/* if (flags & CBL_DISABLE_CACHES) {
* turn off D-cache /*
* dcache_disable() in turn flushes the d-cache and disables MMU * turn off D-cache
*/ * dcache_disable() in turn flushes the d-cache and disables MMU
dcache_disable(); */
v7_outer_cache_disable(); dcache_disable();
v7_outer_cache_disable();
/* /*
* After D-cache is flushed and before it is disabled there may * After D-cache is flushed and before it is disabled there may
* be some new valid entries brought into the cache. We are sure * be some new valid entries brought into the cache. We are
* that these lines are not dirty and will not affect our execution. * sure that these lines are not dirty and will not affect our
* (because unwinding the call-stack and setting a bit in CP15 SCTLR * execution. (because unwinding the call-stack and setting a
* is all we did during this. We have not pushed anything on to the * bit in CP15 SCTRL is all we did during this. We have not
* stack. Neither have we affected any static data) * pushed anything on to the stack. Neither have we affected
* So just invalidate the entire d-cache again to avoid coherency * any static data) So just invalidate the entire d-cache again
* problems for kernel * to avoid coherency problems for kernel
*/ */
invalidate_dcache_all(); invalidate_dcache_all();
} else {
flush_dcache_all();
invalidate_icache_all();
icache_enable();
}
/* /*
* Some CPU need more cache attention before starting the kernel. * Some CPU need more cache attention before starting the kernel.
...@@ -68,3 +74,8 @@ int cleanup_before_linux(void) ...@@ -68,3 +74,8 @@ int cleanup_before_linux(void)
return 0; return 0;
} }
int cleanup_before_linux(void)
{
return cleanup_before_linux_select(CBL_ALL);
}
...@@ -714,6 +714,21 @@ void invalidate_dcache_range(unsigned long start, unsigned long stop); ...@@ -714,6 +714,21 @@ void invalidate_dcache_range(unsigned long start, unsigned long stop);
void invalidate_dcache_all(void); void invalidate_dcache_all(void);
void invalidate_icache_all(void); void invalidate_icache_all(void);
enum {
/* Disable caches (else flush caches but leave them active) */
CBL_DISABLE_CACHES = 1 << 0,
CBL_SHOW_BOOTSTAGE_REPORT = 1 << 1,
CBL_ALL = 3,
};
/**
* Clean up ready for linux
*
* @param flags Flags to control what is done
*/
int cleanup_before_linux_select(int flags);
/* arch/$(ARCH)/lib/ticks.S */ /* arch/$(ARCH)/lib/ticks.S */
uint64_t get_ticks(void); uint64_t get_ticks(void);
void wait_ticks (unsigned long); void wait_ticks (unsigned long);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment