cc951732 |
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 |
198a1649 |
14 | |
8d04105a |
15 | #define CACHELINE_SZC #32 |
16 | |
cc951732 |
17 | #if !defined(CONFIG_CPU_ARM926T) && !defined(CONFIG_CPU_ARM920T) |
198a1649 |
18 | #error CPU not supported |
19 | #endif |
20 | |
21 | .text |
22 | .align 2 |
23 | |
24 | .global warm_cop_clean_inval_d |
cc951732 |
25 | .global warm_cop_clean_d |
26 | |
27 | #ifdef CONFIG_CPU_ARM926T |
28 | |
198a1649 |
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 | |
198a1649 |
34 | warm_cop_clean_d: |
35 | 0: mrc p15, 0, r15, c7, c10, 3 @ test and clean |
36 | bne 0b |
37 | bx lr |
38 | |
cc951732 |
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 |
198a1649 |
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: ;\ |
8d04105a |
97 | bic r0, r0, CACHELINE_SZC-1 ;\ |
198a1649 |
98 | 0: f1 ;\ |
99 | f2 ;\ |
8d04105a |
100 | add r0, r0, CACHELINE_SZC ;\ |
101 | subs r1, r1, CACHELINE_SZC ;\ |
198a1649 |
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 | |
cc951732 |
121 | |
122 | @ vim:filetype=armasm |
123 | |