541d69dec1afbd68b88bd91becc241d3c2a5145f
[warm.git] / module / warm_ops.S
1 /* vim:filetype=armasm
2 */
3
4 #include <linux/init.h>
5
6 #define CACHELINE_SZC #32
7
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
16 warm_cop_clean_inval_d:
17 0:  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
23 warm_cop_clean_d:
24 0:  mrc    p15, 0, r15, c7, c10, 3      @ test and clean
25     bne    0b
26     bx     lr
27
28
29 .global warm_cop_inval_d
30 warm_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
37 warm_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
44 warm_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                                    ;\
64 name:                                           ;\
65     bic    r0, r0, CACHELINE_SZC-1              ;\
66 0:  f1                                          ;\
67     f2                                          ;\
68     add    r0, r0, CACHELINE_SZC                ;\
69     subs   r1, r1, CACHELINE_SZC                ;\
70     bgt    0b                                   ;\
71     bx     lr
72
73 WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_di, R_CLEAN_INVAL_D, R_INVAL_I)
74 WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_d,  R_CLEAN_INVAL_D, )
75 WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_i,  R_CLEAN_D,       R_INVAL_I)
76 WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d,          R_CLEAN_D, )
77 WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_di,         R_INVAL_D, R_INVAL_I)
78 WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_d,          R_INVAL_D, )
79 WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_i,          R_INVAL_I, )
80
81
82 .global warm_drain_wb_inval_tlb
83 warm_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