2.4 kernel support, manual module loading for 2.6
[warm.git] / module / warm_ops.S
CommitLineData
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 29warm_cop_clean_inval_d:
300: mrc p15, 0, r15, c7, c14, 3 @ test, clean and invalidate
31 bne 0b
32 bx lr
33
198a1649 34warm_cop_clean_d:
350: 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
441: orr r3, r1, #0xfc000000 @ 64 entries
452: 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
53warm_cop_clean_inval_d:
54 warm_cop_wholecache_dop c14
55
56warm_cop_clean_d:
57 warm_cop_wholecache_dop c10
58
59#endif
198a1649 60
61.global warm_cop_inval_d
62warm_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
69warm_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
76warm_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 ;\
96name: ;\
8d04105a 97 bic r0, r0, CACHELINE_SZC-1 ;\
198a1649 980: f1 ;\
99 f2 ;\
8d04105a 100 add r0, r0, CACHELINE_SZC ;\
101 subs r1, r1, CACHELINE_SZC ;\
198a1649 102 bgt 0b ;\
103 bx lr
104
105WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_di, R_CLEAN_INVAL_D, R_INVAL_I)
106WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_d, R_CLEAN_INVAL_D, )
107WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d_inval_i, R_CLEAN_D, R_INVAL_I)
108WARM_COP_MK_RANGE_FUNC(warm_cop_r_clean_d, R_CLEAN_D, )
109WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_di, R_INVAL_D, R_INVAL_I)
110WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_d, R_INVAL_D, )
111WARM_COP_MK_RANGE_FUNC(warm_cop_r_inval_i, R_INVAL_I, )
112
113
114.global warm_drain_wb_inval_tlb
115warm_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