initial commit
[freebsd-arm:freebsd-arm.git] / arm / arm / cpufunc_asm_fa526.S
1 /*      $NetBSD: cpufunc_asm_fa526.S,v 1.3 2008/10/15 16:56:49 matt Exp $*/
2 /*-
3  * Copyright (c) 2008 The NetBSD Foundation, Inc.
4  * All rights reserved.
5  *
6  * This code is derived from software contributed to The NetBSD Foundation
7  * by Matt Thomas <matt@3am-software.com>
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
30
31
32 #include <machine/asm.h>
33
34 #define CACHELINE_SIZE  16
35
36 ENTRY(fa526_setttb)
37         mov     r1, #0
38         mcr     p15, 0, r1, c7, c14, 0  /* clean and invalidate D$ */
39         mcr     p15, 0, r1, c7, c5, 0   /* invalidate I$ */
40         mcr     p15, 0, r1, c7, c5, 6   /* invalidate BTB */
41         mcr     p15, 0, r1, c7, c10, 4  /* drain write and fill buffer */
42
43         mcr     p15, 0, r0, c2, c0, 0   /* Write the TTB */
44
45         /* If we have updated the TTB we must flush the TLB */
46         mcr     p15, 0, r1, c8, c7, 0   /* invalidate I+D TLB */
47
48         /* Make sure that pipeline is emptied */
49         mov     r0, r0
50         mov     r0, r0
51         mov     pc, lr
52
53 ENTRY(fa526_additional_setup)
54         mov     r0, #1
55         nop
56         nop
57         mcr     p15, 0, r0, c1, c1, 0           @ turn-on ECR
58         mov     pc, lr
59
60 ENTRY(fa526_read_mcr)
61         nop
62         nop
63         mrc     p15, 0, r0, c1, c0, 0
64         mov     pc, lr
65         
66 /*
67  * TLB functions
68  */
69 ENTRY(fa526_tlb_flushID_SE)
70         mcr     p15, 0, r0, c8, c7, 1   /* flush Utlb single entry */
71         mov     pc, lr
72
73 /*
74  * TLB functions
75  */
76 ENTRY(fa526_tlb_flushI_SE)
77         mcr     p15, 0, r0, c8, c5, 1   /* flush Itlb single entry */
78         mov     pc, lr
79
80 ENTRY(fa526_cpu_sleep)
81         mov     r0, #0
82 /*      nop
83         nop*/
84         mcr     p15, 0, r0, c7, c0, 4   /* Wait for interrupt*/
85         mov     pc, lr
86
87 ENTRY(fa526_flush_prefetchbuf)
88         mov     r0, #0
89         mcr     p15, 0, r0, c7, c5, 4   /* Pre-fetch flush */
90         mov     pc, lr
91
92 /*
93  * Cache functions
94  */
95 ENTRY(fa526_idcache_wbinv_all)
96         mov     r0, #0
97         mcr     p15, 0, r0, c7, c14, 0  /* clean and invalidate D$ */
98         mcr     p15, 0, r0, c7, c5, 0   /* invalidate I$ */
99         mcr     p15, 0, r0, c7, c10, 4  /* drain write buffer */
100         mov     pc, lr
101
102 ENTRY(fa526_icache_sync_all)
103         mov     r0, #0
104         mcr     p15, 0, r0, c7, c5, 0   /* invalidate I$ */
105         mov     pc, lr
106
107 ENTRY(fa526_dcache_wbinv_all)
108         mov     r0, #0
109         mcr     p15, 0, r0, c7, c14, 0  /* clean and invalidate D$ */
110         mcr     p15, 0, r0, c7, c10, 4  /* drain write buffer */
111         mov     pc, lr
112
113 /*
114  * Soft functions
115  */
116 ENTRY(fa526_dcache_wbinv_range)
117         cmp     r1, #0x4000
118         bhs     _C_LABEL(fa526_dcache_wbinv_all)
119
120         and     r2, r0, #(CACHELINE_SIZE - 1)
121         add     r1, r1, r2
122         bic     r0, r0, #(CACHELINE_SIZE - 1)
123
124 1:      mcr     p15, 0, r0, c7, c14, 1  /* clean and invalidate D$ entry */
125         add     r0, r0, #CACHELINE_SIZE
126         subs    r1, r1, #CACHELINE_SIZE
127         bhi     1b
128
129         mcr     p15, 0, r0, c7, c10, 4  /* drain write buffer */
130         mov     pc, lr
131
132 ENTRY(fa526_dcache_wb_range)
133         cmp     r1, #0x4000
134         bls     1f
135
136         mov     r0, #0
137         mcr     p15, 0, r0, c7, c10, 0  /* clean entire D$ */
138         b       3f
139
140 1:      and     r2, r0, #(CACHELINE_SIZE - 1)
141         add     r1, r1, r2
142         bic     r0, r0, #(CACHELINE_SIZE - 1)
143
144 2:      mcr     p15, 0, r0, c7, c10, 1  /* clean D$ entry */
145         add     r0, r0, #CACHELINE_SIZE
146         subs    r1, r1, #CACHELINE_SIZE
147         bhi     2b
148
149 3:      mcr     p15, 0, r0, c7, c10, 4  /* drain write buffer */
150         mov     pc, lr
151
152 ENTRY(fa526_dcache_inv_range)
153         and     r2, r0, #(CACHELINE_SIZE - 1)
154         add     r1, r1, r2
155         bic     r0, r0, #(CACHELINE_SIZE - 1)
156
157 1:      mcr     p15, 0, r0, c7, c6, 1   /* invalidate D$ single entry */
158         add     r0, r0, #CACHELINE_SIZE
159         subs    r1, r1, #CACHELINE_SIZE
160         bhi     1b
161
162         mov     pc, lr
163
164 ENTRY(fa526_idcache_wbinv_range)
165         cmp     r1, #0x4000
166         bhs     _C_LABEL(fa526_idcache_wbinv_all)
167
168         and     r2, r0, #(CACHELINE_SIZE - 1)
169         add     r1, r1, r2
170         bic     r0, r0, #(CACHELINE_SIZE - 1)
171
172 1:      mcr     p15, 0, r0, c7, c14, 1  /* clean and invalidate D$ entry */
173         mcr     p15, 0, r0, c7, c5, 1   /* invalidate I$ entry */
174         add     r0, r0, #CACHELINE_SIZE
175         subs    r1, r1, #CACHELINE_SIZE
176         bhi     1b
177
178 2:      mcr     p15, 0, r0, c7, c10, 4  /* drain write buffer */
179         mov     pc, lr
180
181 ENTRY(fa526_icache_sync_range)
182         cmp     r1, #0x4000
183         bhs     _C_LABEL(fa526_icache_sync_all)
184
185         and     r2, r0, #(CACHELINE_SIZE - 1)
186         add     r1, r1, r2
187         bic     r0, r0, #(CACHELINE_SIZE - 1)
188
189 1:      mcr     p15, 0, r0, c7, c10, 1  /* clean D$ entry */
190         mcr     p15, 0, r0, c7, c5, 1   /* invalidate I$ entry */
191         add     r0, r0, #CACHELINE_SIZE
192         subs    r1, r1, #CACHELINE_SIZE
193         bhi     1b
194
195 2:      mcr     p15, 0, r0, c7, c10, 4  /* drain write buffer */
196         mov     pc, lr
197
198 ENTRY(fa526_flush_brnchtgt_E)
199         mov     r0, #0
200         mcr     p15, 0, r0, c7, c5, 6   /* invalidate BTB cache */
201         mov     pc, lr
202
203 ENTRY(fa526_context_switch)
204         /*
205          * CF_CACHE_PURGE_ID will *ALWAYS* be called prior to this.
206          * Thus the data cache will contain only kernel data and the
207          * instruction cache will contain only kernel code, and all
208          * kernel mappings are shared by all processes.
209          */
210
211         mcr     p15, 0, r0, c2, c0, 0   /* Write the TTB */
212
213         /* If we have updated the TTB we must flush the TLB */
214         mov     r0, #0
215         mcr     p15, 0, r0, c8, c7, 0   /* flush the I+D tlb */
216
217         /* Make sure that pipeline is emptied */
218         mov     r0, r0
219         mov     r0, r0
220         mov     pc, lr
221