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