summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Bukat <marcin.bukat@gmail.com>2013-01-12 21:57:37 +0100
committerMarcin Bukat <marcin.bukat@gmail.com>2013-01-12 21:57:37 +0100
commit29e51a17775df5040b12d93834c45b3f1171ed9d (patch)
treeed8acf1ed71979be83f0717589e88314efc4d27b
parente2be0e75ab91ff9a29496a375386297bdb184716 (diff)
downloadrockbox-29e51a17775df5040b12d93834c45b3f1171ed9d.tar.gz
rockbox-29e51a17775df5040b12d93834c45b3f1171ed9d.zip
rk27xx: slightly optimize commit_discard_dcache_range()
Change-Id: I13ce643d4ba26db5de9ffa083070d7f40b0e7b1f
-rw-r--r--firmware/target/arm/rk27xx/system-rk27xx.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/firmware/target/arm/rk27xx/system-rk27xx.c b/firmware/target/arm/rk27xx/system-rk27xx.c
index 20d0226892..712c7d6549 100644
--- a/firmware/target/arm/rk27xx/system-rk27xx.c
+++ b/firmware/target/arm/rk27xx/system-rk27xx.c
@@ -218,18 +218,17 @@ void commit_discard_dcache (void) __attribute__((alias("commit_discard_idcache")
218 218
219void commit_discard_dcache_range (const void *base, unsigned int size) 219void commit_discard_dcache_range (const void *base, unsigned int size)
220{ 220{
221 int cnt = size + ((unsigned long)base & 0x1f); 221 /* 0x01 is opcode for cache line commit discard */
222 unsigned long opcode = ((unsigned long)base & 0xffffffe0) | 0x01; 222 uint32_t end_opcode = (uint32_t)((uintptr_t)base + size) | 0x01;
223 uint32_t opcode = (uint32_t)((uintptr_t)base & 0xffffffe0) | 0x01;
223 224
224 int old_irq = disable_irq_save(); 225 int old_irq = disable_irq_save();
225 226
226 while (cnt > 0) 227 while (opcode <= end_opcode)
227 { 228 {
228 CACHEOP = opcode;
229
230 while (CACHEOP & 0x03); 229 while (CACHEOP & 0x03);
231 230
232 cnt -= 32; 231 CACHEOP = opcode;
233 opcode += 32; 232 opcode += 32;
234 } 233 }
235 234