@ -24,7 +24,7 @@
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
@ -42,24 +42,30 @@ int cleanup_before_linux(void)
icache_disable ( ) ;
invalidate_icache_all ( ) ;
/*
* turn off D - cache
* dcache_disable ( ) in turn flushes the d - cache and disables MMU
*/
dcache_disable ( ) ;
v7_outer_cache_disable ( ) ;
if ( flags & CBL_DISABLE_CACHES ) {
/*
* turn off D - cache
* dcache_disable ( ) in turn flushes the d - cache and disables MMU
*/
dcache_disable ( ) ;
v7_outer_cache_disable ( ) ;
/*
* After D - cache is flushed and before it is disabled there may
* be some new valid entries brought into the cache . We are sure
* that these lines are not dirty and will not affect our execution .
* ( because unwinding the call - stack and setting a bit in CP15 SCTLR
* is all we did during this . We have not pushed anything on to the
* stack . Neither have we affected any static data )
* So just invalidate the entire d - cache again to avoid coherency
* problems for kernel
*/
invalidate_dcache_all ( ) ;
/*
* After D - cache is flushed and before it is disabled there may
* be some new valid entries brought into the cache . We are
* sure that these lines are not dirty and will not affect our
* execution . ( because unwinding the call - stack and setting a
* bit in CP15 SCTRL is all we did during this . We have not
* pushed anything on to the stack . Neither have we affected
* any static data ) So just invalidate the entire d - cache again
* to avoid coherency problems for kernel
*/
invalidate_dcache_all ( ) ;
} else {
flush_dcache_all ( ) ;
invalidate_icache_all ( ) ;
icache_enable ( ) ;
}
/*
* Some CPU need more cache attention before starting the kernel .
@ -68,3 +74,8 @@ int cleanup_before_linux(void)
return 0 ;
}
int cleanup_before_linux ( void )
{
return cleanup_before_linux_select ( CBL_ALL ) ;
}