diff options
author | David Hendricks <dhendrix@chromium.org> | 2013-03-19 17:11:31 -0700 |
---|---|---|
committer | David Hendricks <dhendrix@chromium.org> | 2013-03-21 05:11:59 +0100 |
commit | 8ec69053f1a9f107f73f018fd613cf3038a12c7c (patch) | |
tree | 6a613debdc996358e23aeee8e2a4888ad9ba8bf1 /src/arch/armv7/lib | |
parent | eb06a4259b48128faed94b4ca3f8c64d3cd5a4c3 (diff) |
armv7: move armv7_invalidate_caches() to cache.c
This just moves cache maintenance stuff from the armv7 bootblock
code to cache.c
Change-Id: I0b3ab58a1d8a3fe3d9568e02e156a36b6f33ca0b
Signed-off-by: David Hendricks <dhendrix@chromium.org>
Reviewed-on: http://review.coreboot.org/2867
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Tested-by: build bot (Jenkins)
Diffstat (limited to 'src/arch/armv7/lib')
-rw-r--r-- | src/arch/armv7/lib/cache.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/arch/armv7/lib/cache.c b/src/arch/armv7/lib/cache.c index 62ae755ded..45d3308fbc 100644 --- a/src/arch/armv7/lib/cache.c +++ b/src/arch/armv7/lib/cache.c @@ -170,6 +170,55 @@ void dcache_clean_invalidate_by_mva(unsigned long addr, unsigned long len) dccimvac(addr); } +void armv7_invalidate_caches(void) +{ + uint32_t clidr; + int level; + + /* Invalidate branch predictor */ + bpiall(); + + /* Iterate thru each cache identified in CLIDR and invalidate */ + clidr = read_clidr(); + for (level = 0; level < 7; level++) { + unsigned int ctype = (clidr >> (level * 3)) & 0x7; + uint32_t csselr; + + switch(ctype) { + case 0x0: + /* no cache */ + break; + case 0x1: + /* icache only */ + csselr = (level << 1) | 1; + write_csselr(csselr); + icache_invalidate_all(); + break; + case 0x2: + case 0x4: + /* dcache only or unified cache */ + dcache_invalidate_all(); + break; + case 0x3: + /* separate icache and dcache */ + csselr = (level << 1) | 1; + write_csselr(csselr); + icache_invalidate_all(); + + csselr = level < 1; + write_csselr(csselr); + dcache_invalidate_all(); + break; + default: + /* reserved */ + break; + } + } + + /* Invalidate TLB */ + tlb_invalidate_all(); +} + /* FIXME: wrapper around imported mmu_setup() for now */ extern void mmu_setup(unsigned long start, unsigned long size); void mmu_setup_by_mva(unsigned long start, unsigned long size) |