#include <machine/asm.h>
#include <arm/armreg.h>
#include <arm/sysreg.h>
ENTRY(armv7_cpu_sleep)
wfi
mov pc, lr
ENTRY(armv7_drain_writebuf)
dsb sy
isb sy
mov pc, lr
ENTRY(armv7_periphbase)
mrc CP15_CBAR(r0)
mov pc, lr
#define TTBR_DEFAULT (TTBR_IRGN_WBNWA | TTBR_RGN_WBNWA)
ENTRY(armv7_setttb)
mcr CP15_ICIALLU
dsb sy
isb sy
orr r0, r0, #TTBR_DEFAULT
mcr CP15_TTBR0(r0)
mcr CP15_TLBIALL(r0)
dsb sy
isb sy
mov pc, lr
ENTRY(armv7_tlb_flushID_SE)
mcr CP15_TLBIMVA(r0)
mcr CP15_BPIMVA
dsb sy
isb sy
mov pc, lr
ENTRY(armv7_tlb_flushID)
mcr CP15_TLBIALL(r0)
mcr CP15_BPIALL
dsb sy
isb sy
mov pc, lr
ENTRY(armv7_tlb_flushD_SE)
mcr CP15_TLBIMVA(r0)
dsb sy
isb sy
mov pc, lr
ENTRY(armv7_tlb_flushD)
mcr CP15_TLBIALL(r0)
dsb sy
isb sy
mov pc, lr
.Larmv7_dcache_line_size:
.word arm_dcache_min_line_size
.Larmv7_icache_line_size:
.word arm_icache_min_line_size
.Larmv7_idcache_line_size:
.word arm_idcache_min_line_size
s_max .req r0
i_max .req r1
s_inc .req r2
i_inc .req r3
ENTRY(armv7_icache_sync_range)
ldr ip, .Larmv7_icache_line_size
ldr ip, [ip]
sub r3, ip, #1
and r2, r0, r3
add r1, r1, r2
bic r0, r0, r3
1:
mcr CP15_DCCMVAU(r0)
mcr CP15_ICIMVAU(r0)
add r0, r0, ip
subs r1, r1, ip
bhi 1b
mcr CP15_BPIALL
dsb sy
isb sy
mov pc, lr
ENTRY(armv7_icache_sync_all)
.Larmv7_icache_sync_all:
mcr CP15_ICIALLU
isb sy
mov pc, lr
ENTRY(armv7_dcache_wb_range)
ldr ip, .Larmv7_dcache_line_size
ldr ip, [ip]
sub r3, ip, #1
and r2, r0, r3
add r1, r1, r2
bic r0, r0, r3
1:
mcr CP15_DCCMVAC(r0)
add r0, r0, ip
subs r1, r1, ip
bhi 1b
dsb sy
isb sy
mov pc, lr
ENTRY(armv7_idcache_wbinv_range)
ldr ip, .Larmv7_idcache_line_size
ldr ip, [ip]
sub r3, ip, #1
and r2, r0, r3
add r1, r1, r2
bic r0, r0, r3
1:
mcr CP15_DCCMVAU(r0)
mcr CP15_ICIMVAU(r0)
mcr CP15_DCCIMVAC(r0)
add r0, r0, ip
subs r1, r1, ip
bhi 1b
mcr CP15_BPIALL
dsb sy
isb sy
mov pc, lr
ENTRY(armv7_dcache_wbinv_range)
ldr ip, .Larmv7_dcache_line_size
ldr ip, [ip]
sub r3, ip, #1
and r2, r0, r3
add r1, r1, r2
bic r0, r0, r3
1:
mcr CP15_DCCMVAU(r0)
mcr CP15_ICIMVAU(r0)
mcr CP15_DCCIMVAC(r0)
add r0, r0, ip
subs r1, r1, ip
bhi 1b
dsb sy
isb sy
mov pc, lr
ENTRY(armv7_dcache_inv_range)
ldr ip, .Larmv7_dcache_line_size
ldr ip, [ip]
sub r3, ip, #1
and r2, r0, r3
add r1, r1, r2
bic r0, r0, r3
1:
mcr CP15_DCCMVAU(r0)
mcr CP15_ICIMVAU(r0)
mcr CP15_DCIMVAC(r0)
add r0, r0, ip
subs r1, r1, ip
bhi 1b
dsb sy
isb sy
mov pc, lr
ENTRY(armv7_flush_bp)
mcr CP15_BPIALL
mov pc, lr
ENTRY(cortex_a15_flush_bp)
mcr CP15_ICIALLU
mov pc, lr
ENTRY(armv7_context_switch)
mcr CP15_ICIALLU
dsb sy
isb sy
orr r0, r0, #TTBR_DEFAULT
mcr CP15_TTBR0(r0)
mcr CP15_TLBIALL(r0)
dsb sy
isb sy
mov pc, lr
#define _DATA_OBJECT(x) .globl x; .type x,_ASM_TYPE_OBJECT; x:
#define C_OBJECT(x) _DATA_OBJECT(x)
.align 2
C_OBJECT(armv7_dcache_sets_max)
.word 0
C_OBJECT(armv7_dcache_index_max)
.word 0
C_OBJECT(armv7_dcache_sets_inc)
.word 0
C_OBJECT(armv7_dcache_index_inc)
.word 0