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 |
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: ;\ |
8d04105a |
65 | bic r0, r0, CACHELINE_SZC-1 ;\ |
198a1649 |
66 | 0: f1 ;\ |
67 | f2 ;\ |
8d04105a |
68 | add r0, r0, CACHELINE_SZC ;\ |
69 | subs r1, r1, CACHELINE_SZC ;\ |
198a1649 |
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 | |