2.4 kernel support, manual module loading for 2.6
[warm.git] / module / warm_ops.S
1 /*
2  * Cache operations
3  *
4  * Author: GraÅžvydas "notaz" Ignotas
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10
11 #ifndef AUTOCONF_INCLUDED
12 #include <linux/config.h>
13 #endif
14
15 #define CACHELINE_SZC #32
16
17 #if !defined(CONFIG_CPU_ARM926T) && !defined(CONFIG_CPU_ARM920T)
18 #error CPU not supported
19 #endif
20
21 .text
22 .align 2
23
24 .global warm_cop_clean_inval_d
25 .global warm_cop_clean_d
26
27 #ifdef CONFIG_CPU_ARM926T
28
29 warm_cop_clean_inval_d:
30 0:  mrc    p15, 0, r15, c7, c14, 3      @ test, clean and invalidate
31     bne    0b
32     bx     lr
33
34 warm_cop_clean_d:
35 0:  mrc    p15, 0, r15, c7, c10, 3      @ test and clean
36     bne    0b
37     bx     lr
38
39 #else
40
41 /* comes from Linux kernel code */
42 .macro warm_cop_wholecache_dop crm
43     mov    r1,     #0x000000e0          @ 8 segments
44 1:  orr    r3, r1, #0xfc000000          @ 64 entries
45 2:  mcr    p15, 0, r3, c7, \crm, 2      @ D index op
46     subs   r3, r3, #1<<26
47     bcs    2b                           @ entries 63 to 0
48     subs   r1, r1, #1<<5
49     bcs    1b                           @ segments 7 to 0
50     bx     lr
51 .endm
52
53 warm_cop_clean_inval_d:
54     warm_cop_wholecache_dop c14
55
56 warm_cop_clean_d:
57     warm_cop_wholecache_dop c10
58
59 #endif
60
61 .global warm_cop_inval_d
62 warm_cop_inval_d:
63     mov    r0, #0
64     mcr    p15, 0, r0, c7, c6, 0
65     bx     lr
66
67
68 .global warm_cop_inval_i
69 warm_cop_inval_i:
70     mov    r0, #0
71     mcr    p15, 0, r0, c7, c5, 0
72     bx     lr
73
74
75 .global warm_cop_drain_wb
76 warm_cop_drain_wb:
77     mov    r0, #0
78     mcr    p15, 0, r0, c7, c10, 4
79     bx     lr
80
81
82 #define R_CLEAN_INVAL_D \
83     mcr    p15, 0, r0, c7, c14, 1
84
85 #define R_CLEAN_D \
86     mcr    p15, 0, r0, c7, c10, 1
87
88 #define R_INVAL_D \
89     mcr    p15, 0, r0, c7, c6, 1
90
91 #define R_INVAL_I \
92     mcr    p15, 0, r0, c7, c5, 1
93
94 #define WARM_COP_MK_RANGE_FUNC(name,f1,f2)      \
95 .global name                                    ;\
96 name:                                           ;\
97     bic    r0, r0, CACHELINE_SZC-1              ;\
98 0:  f1                                          ;\
99     f2                                          ;\
100     add    r0, r0, CACHELINE_SZC                ;\
101     subs   r1, r1, CACHELINE_SZC                ;\
102     bgt    0b                                   ;\
103     bx     lr
104
105 WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_di, R_CLEAN_INVAL_D, R_INVAL_I)
106 WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_d,  R_CLEAN_INVAL_D, )
107 WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_i,  R_CLEAN_D,       R_INVAL_I)
108 WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d,          R_CLEAN_D, )
109 WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_di,         R_INVAL_D, R_INVAL_I)
110 WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_d,          R_INVAL_D, )
111 WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_i,          R_INVAL_I, )
112
113
114 .global warm_drain_wb_inval_tlb
115 warm_drain_wb_inval_tlb:
116     mov    r0, #0
117     mcr    p15, 0, r0, c7, c10, 4
118     mcr    p15, 0, r0, c8, c7, 0
119     bx     lr
120
121
122 @ vim:filetype=armasm
123