r1 (released with gpSP)
[warm.git] / module / warm_ops.S
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
14 warm_cop_clean_inval_d:
15 0:  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
21 warm_cop_clean_d:
22 0:  mrc    p15, 0, r15, c7, c10, 3      @ test and clean
23     bne    0b
24     bx     lr
25
26
27 .global warm_cop_inval_d
28 warm_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
35 warm_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
42 warm_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                                    ;\
62 name:                                           ;\
63     bic    r0, r0, #32-1                        ;\
64 0:  f1                                          ;\
65     f2                                          ;\
66     add    r0, r0, #32                          ;\
67     subs   r1, r1, #32                          ;\
68     bgt    0b                                   ;\
69     bx     lr
70
71 WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_di, R_CLEAN_INVAL_D, R_INVAL_I)
72 WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_d,  R_CLEAN_INVAL_D, )
73 WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_i,  R_CLEAN_D,       R_INVAL_I)
74 WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d,          R_CLEAN_D, )
75 WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_di,         R_INVAL_D, R_INVAL_I)
76 WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_d,          R_INVAL_D, )
77 WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_i,          R_INVAL_I, )
78
79
80 .global warm_drain_wb_inval_tlb
81 warm_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