]>
Commit | Line | Data |
---|---|---|
72a087e0 WD |
1 | /* |
2 | * Copyright (C) 2004-2006 Atmel Corporation | |
3 | * | |
1a459660 | 4 | * SPDX-License-Identifier: GPL-2.0+ |
72a087e0 WD |
5 | */ |
6 | ||
7 | #include <common.h> | |
8 | ||
d8f2aa32 | 9 | #include <asm/arch/cacheflush.h> |
72a087e0 WD |
10 | |
11 | void dcache_clean_range(volatile void *start, size_t size) | |
12 | { | |
13 | unsigned long v, begin, end, linesz; | |
14 | ||
6d0f6bcf | 15 | linesz = CONFIG_SYS_DCACHE_LINESZ; |
72a087e0 WD |
16 | |
17 | /* You asked for it, you got it */ | |
18 | begin = (unsigned long)start & ~(linesz - 1); | |
19 | end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1); | |
20 | ||
21 | for (v = begin; v < end; v += linesz) | |
22 | dcache_clean_line((void *)v); | |
23 | ||
24 | sync_write_buffer(); | |
25 | } | |
26 | ||
0e055435 | 27 | void invalidate_dcache_range(unsigned long start, unsigned long stop) |
72a087e0 | 28 | { |
0e055435 | 29 | unsigned long v, linesz; |
72a087e0 | 30 | |
6d0f6bcf | 31 | linesz = CONFIG_SYS_DCACHE_LINESZ; |
72a087e0 WD |
32 | |
33 | /* You asked for it, you got it */ | |
0e055435 AB |
34 | start = start & ~(linesz - 1); |
35 | stop = (stop + linesz - 1) & ~(linesz - 1); | |
72a087e0 | 36 | |
0e055435 | 37 | for (v = start; v < stop; v += linesz) |
72a087e0 WD |
38 | dcache_invalidate_line((void *)v); |
39 | } | |
40 | ||
0e055435 | 41 | void flush_dcache_range(unsigned long start, unsigned long stop) |
72a087e0 | 42 | { |
0e055435 | 43 | unsigned long v, linesz; |
72a087e0 | 44 | |
6d0f6bcf | 45 | linesz = CONFIG_SYS_DCACHE_LINESZ; |
72a087e0 WD |
46 | |
47 | /* You asked for it, you got it */ | |
0e055435 AB |
48 | start = start & ~(linesz - 1); |
49 | stop = (stop + linesz - 1) & ~(linesz - 1); | |
72a087e0 | 50 | |
0e055435 | 51 | for (v = start; v < stop; v += linesz) |
72a087e0 WD |
52 | dcache_flush_line((void *)v); |
53 | ||
54 | sync_write_buffer(); | |
55 | } | |
56 | ||
57 | void icache_invalidate_range(volatile void *start, size_t size) | |
58 | { | |
59 | unsigned long v, begin, end, linesz; | |
60 | ||
6d0f6bcf | 61 | linesz = CONFIG_SYS_ICACHE_LINESZ; |
72a087e0 WD |
62 | |
63 | /* You asked for it, you got it */ | |
64 | begin = (unsigned long)start & ~(linesz - 1); | |
65 | end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1); | |
66 | ||
67 | for (v = begin; v < end; v += linesz) | |
68 | icache_invalidate_line((void *)v); | |
69 | } | |
70 | ||
71 | /* | |
72 | * This is called after loading something into memory. We need to | |
73 | * make sure that everything that was loaded is actually written to | |
74 | * RAM, and that the icache will look for it. Cleaning the dcache and | |
75 | * invalidating the icache will do the trick. | |
76 | */ | |
77 | void flush_cache (unsigned long start_addr, unsigned long size) | |
78 | { | |
79 | dcache_clean_range((void *)start_addr, size); | |
80 | icache_invalidate_range((void *)start_addr, size); | |
81 | } |