diff options
author | Marcin Bukat <marcin.bukat@gmail.com> | 2012-09-19 20:44:36 +0200 |
---|---|---|
committer | Marcin Bukat <marcin.bukat@gmail.com> | 2012-09-19 20:44:36 +0200 |
commit | 72ebcbf73b4db911d517a66c820fdceccb8ec798 (patch) | |
tree | c3f1f4c41c9ed2a03ab017b0c70804d271a1a0ef | |
parent | 1c975eefd3304e22556459f71ea6ed840ae75c64 (diff) | |
download | rockbox-72ebcbf73b4db911d517a66c820fdceccb8ec798.tar.gz rockbox-72ebcbf73b4db911d517a66c820fdceccb8ec798.zip |
rk27xx: Fix commit_discard_idcache()
This version resembles how OF handle cache invalidates.
This seems to fix mysterious data aborts on plugin/codec loading
after introducing frequency scaling.
Credit goes to mortalis for pinpointing the reason of aborts.
Change-Id: I3477b3f65d593d7b43c36a0b06d863f71f000812
-rw-r--r-- | firmware/target/arm/rk27xx/system-rk27xx.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/firmware/target/arm/rk27xx/system-rk27xx.c b/firmware/target/arm/rk27xx/system-rk27xx.c index 8c75deef07..27373207bd 100644 --- a/firmware/target/arm/rk27xx/system-rk27xx.c +++ b/firmware/target/arm/rk27xx/system-rk27xx.c | |||
@@ -200,19 +200,29 @@ void udelay(unsigned usecs) | |||
200 | ); | 200 | ); |
201 | } | 201 | } |
202 | 202 | ||
203 | void commit_discard_idcache(void) | 203 | /* Invalidating both cache lines from single function |
204 | * gives sometimes strange data aborts. | ||
205 | * This version resembles how OF invalidates cache. | ||
206 | * noinline attribute is to guarantee that future | ||
207 | * gcc change will not decide to inline this call (although | ||
208 | * current arm-eabi version from our toolchain doesn't do that | ||
209 | */ | ||
210 | static void __attribute__((noinline)) cache_invalidate_way(int way) | ||
204 | { | 211 | { |
205 | /* invalidate cache way 0 */ | 212 | /* Issue invalidata way command to the cache controler */ |
206 | CACHEOP = 0x02; | 213 | CACHEOP = ((way<<31)|0x2); |
207 | 214 | ||
208 | /* wait for invalidate process to complete */ | 215 | /* wait for invalidate process to complete */ |
209 | while (CACHEOP & 0x03); | 216 | while (CACHEOP & 0x03); |
217 | } | ||
210 | 218 | ||
211 | /* invalidate cache way 1 */ | 219 | void commit_discard_idcache(void) |
212 | CACHEOP = 0x80000002; | 220 | { |
221 | /* invalidate cache way 0 */ | ||
222 | cache_invalidate_way(0); | ||
213 | 223 | ||
214 | /* wait for invalidate process to complete */ | 224 | /* invalidate cache way 1 */ |
215 | while (CACHEOP & 0x03); | 225 | cache_invalidate_way(1); |
216 | } | 226 | } |
217 | void commit_discard_dcache (void) __attribute__((alias("commit_discard_idcache"))); | 227 | void commit_discard_dcache (void) __attribute__((alias("commit_discard_idcache"))); |
218 | 228 | ||