提交 0837f524 编写于 作者: P Paul Mundt

sh: Partially unroll the SH-4 __flush_xxx_region() flushers.

This does a bit of unrolling for the SH-4 region flushers.

Based on an earlier patch by SUGIOKA Toshinobu.
Signed-off-by: NPaul Mundt <lethal@linux-sh.org>
上级 81742527
...@@ -10,16 +10,37 @@ ...@@ -10,16 +10,37 @@
*/ */
void __weak __flush_wback_region(void *start, int size) void __weak __flush_wback_region(void *start, int size)
{ {
unsigned long v; unsigned long v, cnt, end;
unsigned long begin, end;
begin = (unsigned long)start & ~(L1_CACHE_BYTES-1); v = (unsigned long)start & ~(L1_CACHE_BYTES-1);
end = ((unsigned long)start + size + L1_CACHE_BYTES-1) end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
& ~(L1_CACHE_BYTES-1); & ~(L1_CACHE_BYTES-1);
for (v = begin; v < end; v+=L1_CACHE_BYTES) { cnt = (end - v) / L1_CACHE_BYTES;
asm volatile("ocbwb %0"
: /* no output */ while (cnt >= 8) {
: "m" (__m(v))); asm volatile("ocbwb @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbwb @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbwb @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbwb @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbwb @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbwb @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbwb @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbwb @%0" : : "r" (v));
v += L1_CACHE_BYTES;
cnt -= 8;
}
while (cnt) {
asm volatile("ocbwb @%0" : : "r" (v));
v += L1_CACHE_BYTES;
cnt--;
} }
} }
...@@ -31,16 +52,36 @@ void __weak __flush_wback_region(void *start, int size) ...@@ -31,16 +52,36 @@ void __weak __flush_wback_region(void *start, int size)
*/ */
void __weak __flush_purge_region(void *start, int size) void __weak __flush_purge_region(void *start, int size)
{ {
unsigned long v; unsigned long v, cnt, end;
unsigned long begin, end;
begin = (unsigned long)start & ~(L1_CACHE_BYTES-1); v = (unsigned long)start & ~(L1_CACHE_BYTES-1);
end = ((unsigned long)start + size + L1_CACHE_BYTES-1) end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
& ~(L1_CACHE_BYTES-1); & ~(L1_CACHE_BYTES-1);
for (v = begin; v < end; v+=L1_CACHE_BYTES) { cnt = (end - v) / L1_CACHE_BYTES;
asm volatile("ocbp %0"
: /* no output */ while (cnt >= 8) {
: "m" (__m(v))); asm volatile("ocbp @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbp @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbp @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbp @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbp @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbp @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbp @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbp @%0" : : "r" (v));
v += L1_CACHE_BYTES;
cnt -= 8;
}
while (cnt) {
asm volatile("ocbp @%0" : : "r" (v));
v += L1_CACHE_BYTES;
cnt--;
} }
} }
...@@ -49,15 +90,36 @@ void __weak __flush_purge_region(void *start, int size) ...@@ -49,15 +90,36 @@ void __weak __flush_purge_region(void *start, int size)
*/ */
void __weak __flush_invalidate_region(void *start, int size) void __weak __flush_invalidate_region(void *start, int size)
{ {
unsigned long v; unsigned long v, cnt, end;
unsigned long begin, end;
begin = (unsigned long)start & ~(L1_CACHE_BYTES-1); v = (unsigned long)start & ~(L1_CACHE_BYTES-1);
end = ((unsigned long)start + size + L1_CACHE_BYTES-1) end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
& ~(L1_CACHE_BYTES-1); & ~(L1_CACHE_BYTES-1);
for (v = begin; v < end; v+=L1_CACHE_BYTES) { cnt = (end - v) / L1_CACHE_BYTES;
asm volatile("ocbi %0"
: /* no output */ while (cnt >= 8) {
: "m" (__m(v))); asm volatile("ocbi @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbi @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbi @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbi @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbi @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbi @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbi @%0" : : "r" (v));
v += L1_CACHE_BYTES;
asm volatile("ocbi @%0" : : "r" (v));
v += L1_CACHE_BYTES;
cnt -= 8;
}
while (cnt) {
asm volatile("ocbi @%0" : : "r" (v));
v += L1_CACHE_BYTES;
cnt--;
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册