r1 (released with gpSP)
[warm.git] / module / warm_ops.S
CommitLineData
198a1649 1/* vim:filetype=armasm
2*/
3
4#include <linux/init.h>
5
6#ifndef CONFIG_CPU_ARM926T
7#error CPU not supported
8#endif
9
10.text
11.align 2
12
13.global warm_cop_clean_inval_d
14warm_cop_clean_inval_d:
150: mrc p15, 0, r15, c7, c14, 3 @ test, clean and invalidate
16 bne 0b
17 bx lr
18
19
20.global warm_cop_clean_d
21warm_cop_clean_d:
220: mrc p15, 0, r15, c7, c10, 3 @ test and clean
23 bne 0b
24 bx lr
25
26
27.global warm_cop_inval_d
28warm_cop_inval_d:
29 mov r0, #0
30 mcr p15, 0, r0, c7, c6, 0
31 bx lr
32
33
34.global warm_cop_inval_i
35warm_cop_inval_i:
36 mov r0, #0
37 mcr p15, 0, r0, c7, c5, 0
38 bx lr
39
40
41.global warm_cop_drain_wb
42warm_cop_drain_wb:
43 mov r0, #0
44 mcr p15, 0, r0, c7, c10, 4
45 bx lr
46
47
48#define R_CLEAN_INVAL_D \
49 mcr p15, 0, r0, c7, c14, 1
50
51#define R_CLEAN_D \
52 mcr p15, 0, r0, c7, c10, 1
53
54#define R_INVAL_D \
55 mcr p15, 0, r0, c7, c6, 1
56
57#define R_INVAL_I \
58 mcr p15, 0, r0, c7, c5, 1
59
60#define WARM_COP_MK_RANGE_FUNC(name,f1,f2) \
61.global name ;\
62name: ;\
63 bic r0, r0, #32-1 ;\
640: f1 ;\
65 f2 ;\
66 add r0, r0, #32 ;\
67 subs r1, r1, #32 ;\
68 bgt 0b ;\
69 bx lr
70
71WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_di, R_CLEAN_INVAL_D, R_INVAL_I)
72WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_d, R_CLEAN_INVAL_D, )
73WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_i, R_CLEAN_D, R_INVAL_I)
74WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d, R_CLEAN_D, )
75WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_di, R_INVAL_D, R_INVAL_I)
76WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_d, R_INVAL_D, )
77WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_i, R_INVAL_I, )
78
79
80.global warm_drain_wb_inval_tlb
81warm_drain_wb_inval_tlb:
82 mov r0, #0
83 mcr p15, 0, r0, c7, c10, 4
84 mcr p15, 0, r0, c8, c7, 0
85 bx lr
86