#include "assym.h"
#include <machine/asm.h>
#include <arm/locore.h>
#define CACHELINE_SIZE 16
ENTRY(fa526_setttb)
cmp r1, #0 @ need to flush the cache / tlb?
beq 1f @ nope, so don't
mov r2, #0
mcr p15, 0, r2, c7, c14, 0
mcr p15, 0, r2, c7, c5, 0
mcr p15, 0, r2, c7, c5, 6
mcr p15, 0, r2, c7, c10, 4
1:
mcr p15, 0, r0, c2, c0, 0
mcrne p15, 0, r1, c8, c7, 0
mov r0, r0
mov r0, r0
mov pc, lr
END(fa526_setttb)
ENTRY(fa526_tlb_flushID_SE)
mcr p15, 0, r0, c8, c7, 1
#if PAGE_SIZE == 2 * L2_S_SIZE
add r0, r0, #L2_S_SIZE
mcr p15, 0, r0, c8, c7, 1
#endif
mov pc, lr
END(fa526_tlb_flushID_SE)
ENTRY(fa526_tlb_flushI_SE)
mcr p15, 0, r0, c8, c5, 1
#if PAGE_SIZE == 2 * L2_S_SIZE
add r0, r0, #L2_S_SIZE
mcr p15, 0, r0, c8, c5, 1
#endif
mov pc, lr
END(fa526_tlb_flushI_SE)
ENTRY(fa526_cpu_sleep)
mov r0, #0
mcr p15, 0, r0, c7, c5, 5
mov pc, lr
END(fa526_cpu_sleep)
ENTRY(fa526_flush_prefetchbuf)
mov r0, #0
mcr p15, 0, r0, c7, c5, 4
mov pc, lr
END(fa526_flush_prefetchbuf)
ENTRY(fa526_idcache_wbinv_all)
mov r0, #0
mcr p15, 0, r0, c7, c14, 0
mcr p15, 0, r0, c7, c5, 0
mcr p15, 0, r0, c7, c10, 4
mov pc, lr
END(fa526_idcache_wbinv_all)
ENTRY(fa526_icache_sync_all)
mov r0, #0
mcr p15, 0, r0, c7, c5, 0
mov pc, lr
END(fa526_icache_sync_all)
ENTRY(fa526_dcache_wbinv_all)
mov r0, #0
mcr p15, 0, r0, c7, c14, 0
mcr p15, 0, r0, c7, c10, 4
mov pc, lr
END(fa526_dcache_wbinv_all)
ENTRY(fa526_dcache_wbinv_range)
cmp r1, #0x4000
bhs _C_LABEL(fa526_dcache_wbinv_all)
and r2, r0, #(CACHELINE_SIZE-1)
add r1, r1, r2
bic r0, r0, #(CACHELINE_SIZE-1)
1: mcr p15, 0, r0, c7, c14, 1
add r0, r0, #CACHELINE_SIZE
subs r1, r1, #CACHELINE_SIZE
bhi 1b
mcr p15, 0, r0, c7, c10, 4
mov pc, lr
END(fa526_dcache_wbinv_range)
ENTRY(fa526_dcache_wb_range)
cmp r1, #0x4000
bls 1f
mov r0, #0
mcr p15, 0, r0, c7, c10, 0
b 3f
1: and r2, r0, #(CACHELINE_SIZE-1)
add r1, r1, r2
bic r0, r0, #(CACHELINE_SIZE-1)
2: mcr p15, 0, r0, c7, c10, 1
add r0, r0, #CACHELINE_SIZE
subs r1, r1, #CACHELINE_SIZE
bhi 2b
3: mcr p15, 0, r0, c7, c10, 4
mov pc, lr
END(fa526_dcache_wb_range)
ENTRY(fa526_dcache_inv_range)
and r2, r0, #(CACHELINE_SIZE-1)
add r1, r1, r2
bic r0, r0, #(CACHELINE_SIZE-1)
1: mcr p15, 0, r0, c7, c6, 1
add r0, r0, #CACHELINE_SIZE
subs r1, r1, #CACHELINE_SIZE
bhi 1b
mov pc, lr
END(fa526_dcache_inv_range)
ENTRY(fa526_idcache_wbinv_range)
cmp r1, #0x4000
bhs _C_LABEL(fa526_idcache_wbinv_all)
and r2, r0, #(CACHELINE_SIZE-1)
add r1, r1, r2
bic r0, r0, #(CACHELINE_SIZE-1)
1: mcr p15, 0, r0, c7, c14, 1
mcr p15, 0, r0, c7, c5, 1
add r0, r0, #CACHELINE_SIZE
subs r1, r1, #CACHELINE_SIZE
bhi 1b
2: mcr p15, 0, r0, c7, c10, 4
mov pc, lr
END(fa526_idcache_wbinv_range)
ENTRY(fa526_icache_sync_range)
cmp r1, #0x4000
bhs _C_LABEL(fa526_icache_sync_all)
and r2, r0, #(CACHELINE_SIZE-1)
add r1, r1, r2
bic r0, r0, #(CACHELINE_SIZE-1)
1: mcr p15, 0, r0, c7, c10, 1
mcr p15, 0, r0, c7, c5, 1
add r0, r0, #CACHELINE_SIZE
subs r1, r1, #CACHELINE_SIZE
bhi 1b
2: mcr p15, 0, r0, c7, c10, 4
mov pc, lr
END(fa526_icache_sync_range)
ENTRY(fa526_flush_brnchtgt_E)
mov r0, #0
mcr p15, 0, r0, c7, c5, 6
mov pc, lr
END(fa526_flush_brnchtgt_E)
ENTRY(fa526_context_switch)
mcr p15, 0, r0, c2, c0, 0
mov r0, #0
mcr p15, 0, r0, c8, c7, 0
mov r0, r0
mov r0, r0
mov pc, lr
END(fa526_context_switch)