1*6f7d103fSpatrick/*	$OpenBSD: bus_space_asm_armv7.S,v 1.5 2016/03/22 23:35:01 patrick Exp $	*/
2e6ca3953Spatrick/*	$NetBSD: bus_space_asm_armv7.S,v 1.3 2003/03/27 19:46:14 mycroft Exp $	*/
3e6ca3953Spatrick
4e6ca3953Spatrick/*
5e6ca3953Spatrick * Copyright (c) 1997 Causality Limited.
6e6ca3953Spatrick * Copyright (c) 1997 Mark Brinicombe.
7e6ca3953Spatrick * All rights reserved.
8e6ca3953Spatrick *
9e6ca3953Spatrick * Redistribution and use in source and binary forms, with or without
10e6ca3953Spatrick * modification, are permitted provided that the following conditions
11e6ca3953Spatrick * are met:
12e6ca3953Spatrick * 1. Redistributions of source code must retain the above copyright
13e6ca3953Spatrick *    notice, this list of conditions and the following disclaimer.
14e6ca3953Spatrick * 2. Redistributions in binary form must reproduce the above copyright
15e6ca3953Spatrick *    notice, this list of conditions and the following disclaimer in the
16e6ca3953Spatrick *    documentation and/or other materials provided with the distribution.
17e6ca3953Spatrick * 3. All advertising materials mentioning features or use of this software
18e6ca3953Spatrick *    must display the following acknowledgement:
19e6ca3953Spatrick *	This product includes software developed by Mark Brinicombe
20e6ca3953Spatrick *	for the NetBSD Project.
21e6ca3953Spatrick * 4. The name of the company nor the name of the author may be used to
22e6ca3953Spatrick *    endorse or promote products derived from this software without specific
23e6ca3953Spatrick *    prior written permission.
24e6ca3953Spatrick *
25e6ca3953Spatrick * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
26e6ca3953Spatrick * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
27e6ca3953Spatrick * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
28e6ca3953Spatrick * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
29e6ca3953Spatrick * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30e6ca3953Spatrick * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31e6ca3953Spatrick * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32e6ca3953Spatrick * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33e6ca3953Spatrick * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34e6ca3953Spatrick * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35e6ca3953Spatrick * SUCH DAMAGE.
36e6ca3953Spatrick */
37e6ca3953Spatrick
38e6ca3953Spatrick#include <arm/asm.h>
39e6ca3953Spatrick#include <arm/cpuconf.h>
40e6ca3953Spatrick
41e6ca3953Spatrick/*
42e6ca3953Spatrick * Generic bus_space functions.
43e6ca3953Spatrick */
44e6ca3953Spatrick
45e6ca3953Spatrick/*
46e6ca3953Spatrick * read single
47e6ca3953Spatrick */
48e6ca3953Spatrick
49e6ca3953SpatrickENTRY(armv7_bs_r_1)
5010aa22a0Sjsg	dsb	sy
51e6ca3953Spatrick	ldrb	r0, [r1, r2]
52e6ca3953Spatrick	mov	pc, lr
53e6ca3953Spatrick
54e6ca3953SpatrickENTRY(armv7_bs_r_2)
5510aa22a0Sjsg	dsb	sy
56e6ca3953Spatrick	ldrh	r0, [r1, r2]
57e6ca3953Spatrick	mov	pc, lr
58e6ca3953Spatrick
59e6ca3953SpatrickENTRY(armv7_bs_r_4)
6010aa22a0Sjsg	dsb	sy
61e6ca3953Spatrick	ldr	r0, [r1, r2]
62e6ca3953Spatrick	mov	pc, lr
63e6ca3953Spatrick
64e6ca3953Spatrick/*
65e6ca3953Spatrick * write single
66e6ca3953Spatrick */
67e6ca3953Spatrick
68e6ca3953SpatrickENTRY(armv7_bs_w_1)
69e6ca3953Spatrick	strb	r3, [r1, r2]
7010aa22a0Sjsg	dsb	sy
71e6ca3953Spatrick	mov	pc, lr
72e6ca3953Spatrick
73e6ca3953SpatrickENTRY(armv7_bs_w_2)
74e6ca3953Spatrick	strh	r3, [r1, r2]
7510aa22a0Sjsg	dsb	sy
76e6ca3953Spatrick	mov	pc, lr
77e6ca3953Spatrick
78e6ca3953SpatrickENTRY(armv7_bs_w_4)
79e6ca3953Spatrick	str	r3, [r1, r2]
8010aa22a0Sjsg	dsb	sy
81e6ca3953Spatrick	mov	pc, lr
82e6ca3953Spatrick
83e6ca3953Spatrick/*
84e6ca3953Spatrick * read multiple
85e6ca3953Spatrick */
86e6ca3953Spatrick
87e6ca3953SpatrickENTRY(armv7_bs_rm_1)
88e6ca3953Spatrick	add	r0, r1, r2
89e6ca3953Spatrick	mov	r1, r3
90e6ca3953Spatrick	ldr	r2, [sp, #0]
91e6ca3953Spatrick	teq	r2, #0
92e6ca3953Spatrick	moveq	pc, lr
93e6ca3953Spatrick
94e6ca3953Spatrick1:	ldrb	r3, [r0]
95e6ca3953Spatrick	strb	r3, [r1], #1
96e6ca3953Spatrick	subs	r2, r2, #1
97e6ca3953Spatrick	bne	1b
9810aa22a0Sjsg	dsb	sy
99e6ca3953Spatrick
100e6ca3953Spatrick	mov	pc, lr
101e6ca3953Spatrick
102e6ca3953SpatrickENTRY(armv7_bs_rm_2)
103e6ca3953Spatrick	add	r0, r1, r2
104e6ca3953Spatrick	mov	r1, r3
105e6ca3953Spatrick	ldr	r2, [sp, #0]
106e6ca3953Spatrick	teq	r2, #0
107e6ca3953Spatrick	moveq	pc, lr
108e6ca3953Spatrick
109e6ca3953Spatrick1:	ldrh	r3, [r0]
110e6ca3953Spatrick	strh	r3, [r1], #2
111e6ca3953Spatrick	subs	r2, r2, #1
112e6ca3953Spatrick	bne	1b
11310aa22a0Sjsg	dsb	sy
114e6ca3953Spatrick
115e6ca3953Spatrick	mov	pc, lr
116e6ca3953Spatrick
117e6ca3953SpatrickENTRY(armv7_bs_rm_4)
118e6ca3953Spatrick	add	r0, r1, r2
119e6ca3953Spatrick	mov	r1, r3
120e6ca3953Spatrick	ldr	r2, [sp, #0]
121e6ca3953Spatrick	teq	r2, #0
122e6ca3953Spatrick	moveq	pc, lr
123e6ca3953Spatrick
124e6ca3953Spatrick1:	ldr	r3, [r0]
125e6ca3953Spatrick	str	r3, [r1], #4
126e6ca3953Spatrick	subs	r2, r2, #1
127e6ca3953Spatrick	bne	1b
12810aa22a0Sjsg	dsb	sy
129e6ca3953Spatrick
130e6ca3953Spatrick	mov	pc, lr
131e6ca3953Spatrick
132e6ca3953Spatrick/*
133e6ca3953Spatrick * write multiple
134e6ca3953Spatrick */
135e6ca3953Spatrick
136e6ca3953SpatrickENTRY(armv7_bs_wm_1)
137e6ca3953Spatrick	add	r0, r1, r2
138e6ca3953Spatrick	mov	r1, r3
139e6ca3953Spatrick	ldr	r2, [sp, #0]
140e6ca3953Spatrick	teq	r2, #0
141e6ca3953Spatrick	moveq	pc, lr
142e6ca3953Spatrick
143e6ca3953Spatrick1:	ldrb	r3, [r1], #1
144e6ca3953Spatrick	strb	r3, [r0]
145e6ca3953Spatrick	subs	r2, r2, #1
146e6ca3953Spatrick	bne	1b
14710aa22a0Sjsg	dsb	sy
148e6ca3953Spatrick
149e6ca3953Spatrick	mov	pc, lr
150e6ca3953Spatrick
151e6ca3953SpatrickENTRY(armv7_bs_wm_2)
152e6ca3953Spatrick	add	r0, r1, r2
153e6ca3953Spatrick	mov	r1, r3
154e6ca3953Spatrick	ldr	r2, [sp, #0]
155e6ca3953Spatrick	teq	r2, #0
156e6ca3953Spatrick	moveq	pc, lr
157e6ca3953Spatrick
158e6ca3953Spatrick1:	ldrh	r3, [r1], #2
159e6ca3953Spatrick	strh	r3, [r0]
160e6ca3953Spatrick	subs	r2, r2, #1
161e6ca3953Spatrick	bne	1b
16210aa22a0Sjsg	dsb	sy
163e6ca3953Spatrick
164e6ca3953Spatrick	mov	pc, lr
165e6ca3953Spatrick
166e6ca3953SpatrickENTRY(armv7_bs_wm_4)
167e6ca3953Spatrick	add	r0, r1, r2
168e6ca3953Spatrick	mov	r1, r3
169e6ca3953Spatrick	ldr	r2, [sp, #0]
170e6ca3953Spatrick	teq	r2, #0
171e6ca3953Spatrick	moveq	pc, lr
172e6ca3953Spatrick
173e6ca3953Spatrick1:	ldr	r3, [r1], #4
174e6ca3953Spatrick	str	r3, [r0]
175e6ca3953Spatrick	subs	r2, r2, #1
176e6ca3953Spatrick	bne	1b
17710aa22a0Sjsg	dsb	sy
178e6ca3953Spatrick
179e6ca3953Spatrick	mov	pc, lr
180e6ca3953Spatrick
181e6ca3953Spatrick/*
182e6ca3953Spatrick * read region
183e6ca3953Spatrick */
184e6ca3953Spatrick
185e6ca3953SpatrickENTRY(armv7_bs_rr_1)
186e6ca3953Spatrick	add	r0, r1, r2
187e6ca3953Spatrick	mov	r1, r3
188e6ca3953Spatrick	ldr	r2, [sp, #0]
189e6ca3953Spatrick	teq	r2, #0
190e6ca3953Spatrick	moveq	pc, lr
191e6ca3953Spatrick
192e6ca3953Spatrick1:	ldrb	r3, [r0], #1
193e6ca3953Spatrick	strb	r3, [r1], #1
194e6ca3953Spatrick	subs	r2, r2, #1
195e6ca3953Spatrick	bne	1b
19610aa22a0Sjsg	dsb	sy
197e6ca3953Spatrick
198e6ca3953Spatrick	mov	pc, lr
199e6ca3953Spatrick
200e6ca3953SpatrickENTRY(armv7_bs_rr_2)
201e6ca3953Spatrick	add	r0, r1, r2
202e6ca3953Spatrick	mov	r1, r3
203e6ca3953Spatrick	ldr	r2, [sp, #0]
204e6ca3953Spatrick	teq	r2, #0
205e6ca3953Spatrick	moveq	pc, lr
206e6ca3953Spatrick
207e6ca3953Spatrick1:	ldrh	r3, [r0], #2
208e6ca3953Spatrick	strh	r3, [r1], #2
209e6ca3953Spatrick	subs	r2, r2, #1
210e6ca3953Spatrick	bne	1b
21110aa22a0Sjsg	dsb	sy
212e6ca3953Spatrick
213e6ca3953Spatrick	mov	pc, lr
214e6ca3953Spatrick
215e6ca3953SpatrickENTRY(armv7_bs_rr_4)
216e6ca3953Spatrick	add	r0, r1, r2
217e6ca3953Spatrick	mov	r1, r3
218e6ca3953Spatrick	ldr	r2, [sp, #0]
219e6ca3953Spatrick	teq	r2, #0
220e6ca3953Spatrick	moveq	pc, lr
221e6ca3953Spatrick
222e6ca3953Spatrick1:	ldr	r3, [r0], #4
223e6ca3953Spatrick	str	r3, [r1], #4
224e6ca3953Spatrick	subs	r2, r2, #1
225e6ca3953Spatrick	bne	1b
226e6ca3953Spatrick
227e6ca3953Spatrick	mov	pc, lr
228e6ca3953Spatrick
229e6ca3953Spatrick/*
230e6ca3953Spatrick * write region.
231e6ca3953Spatrick */
232e6ca3953Spatrick
233e6ca3953SpatrickENTRY(armv7_bs_wr_1)
234e6ca3953Spatrick	add	r0, r1, r2
235e6ca3953Spatrick	mov	r1, r3
236e6ca3953Spatrick	ldr	r2, [sp, #0]
237e6ca3953Spatrick	teq	r2, #0
238e6ca3953Spatrick	moveq	pc, lr
239e6ca3953Spatrick
240e6ca3953Spatrick1:	ldrb	r3, [r1], #1
241e6ca3953Spatrick	strb	r3, [r0], #1
242e6ca3953Spatrick	subs	r2, r2, #1
243e6ca3953Spatrick	bne	1b
24410aa22a0Sjsg	dsb	sy
245e6ca3953Spatrick
246e6ca3953Spatrick	mov	pc, lr
247e6ca3953Spatrick
248e6ca3953SpatrickENTRY(armv7_bs_wr_2)
249e6ca3953Spatrick	add	r0, r1, r2
250e6ca3953Spatrick	mov	r1, r3
251e6ca3953Spatrick	ldr	r2, [sp, #0]
252e6ca3953Spatrick	teq	r2, #0
253e6ca3953Spatrick	moveq	pc, lr
254e6ca3953Spatrick
255e6ca3953Spatrick1:	ldrh	r3, [r1], #2
256e6ca3953Spatrick	strh	r3, [r0], #2
257e6ca3953Spatrick	subs	r2, r2, #1
258e6ca3953Spatrick	bne	1b
25910aa22a0Sjsg	dsb	sy
260e6ca3953Spatrick
261e6ca3953Spatrick	mov	pc, lr
262e6ca3953Spatrick
263e6ca3953SpatrickENTRY(armv7_bs_wr_4)
264e6ca3953Spatrick	add	r0, r1, r2
265e6ca3953Spatrick	mov	r1, r3
266e6ca3953Spatrick	ldr	r2, [sp, #0]
267e6ca3953Spatrick	teq	r2, #0
268e6ca3953Spatrick	moveq	pc, lr
269e6ca3953Spatrick
270e6ca3953Spatrick1:	ldr	r3, [r1], #4
271e6ca3953Spatrick	str	r3, [r0], #4
272e6ca3953Spatrick	subs	r2, r2, #1
273e6ca3953Spatrick	bne	1b
27410aa22a0Sjsg	dsb	sy
275e6ca3953Spatrick
276e6ca3953Spatrick	mov	pc, lr
277e6ca3953Spatrick
278e6ca3953Spatrick/*
279e6ca3953Spatrick * set region
280e6ca3953Spatrick */
281e6ca3953Spatrick
282e6ca3953SpatrickENTRY(armv7_bs_sr_1)
283e6ca3953Spatrick	add	r0, r1, r2
284e6ca3953Spatrick	mov	r1, r3
285e6ca3953Spatrick	ldr	r2, [sp, #0]
286e6ca3953Spatrick	teq	r2, #0
287e6ca3953Spatrick	moveq	pc, lr
288e6ca3953Spatrick
289e6ca3953Spatrick1:	strb	r1, [r0], #1
290e6ca3953Spatrick	subs	r2, r2, #1
291e6ca3953Spatrick	bne	1b
29210aa22a0Sjsg	dsb	sy
293e6ca3953Spatrick
294e6ca3953Spatrick	mov	pc, lr
295e6ca3953Spatrick
296e6ca3953SpatrickENTRY(armv7_bs_sr_2)
297e6ca3953Spatrick	add	r0, r1, r2
298e6ca3953Spatrick	mov	r1, r3
299e6ca3953Spatrick	ldr	r2, [sp, #0]
300e6ca3953Spatrick	teq	r2, #0
301e6ca3953Spatrick	moveq	pc, lr
302e6ca3953Spatrick
303e6ca3953Spatrick1:	strh	r1, [r0], #2
304e6ca3953Spatrick	subs	r2, r2, #1
305e6ca3953Spatrick	bne	1b
30610aa22a0Sjsg	dsb	sy
307e6ca3953Spatrick
308e6ca3953Spatrick	mov	pc, lr
309e6ca3953Spatrick
310e6ca3953SpatrickENTRY(armv7_bs_sr_4)
311e6ca3953Spatrick	add	r0, r1, r2
312e6ca3953Spatrick	mov	r1, r3
313e6ca3953Spatrick	ldr	r2, [sp, #0]
314e6ca3953Spatrick	teq	r2, #0
315e6ca3953Spatrick	moveq	pc, lr
316e6ca3953Spatrick
317e6ca3953Spatrick1:	str	r1, [r0], #4
318e6ca3953Spatrick	subs	r2, r2, #1
319e6ca3953Spatrick	bne	1b
32010aa22a0Sjsg	dsb	sy
321e6ca3953Spatrick
322e6ca3953Spatrick	mov	pc, lr
323e6ca3953Spatrick
324e6ca3953Spatrick/*
325e6ca3953Spatrick * copy region
326e6ca3953Spatrick */
327e6ca3953Spatrick
328e6ca3953SpatrickENTRY(armv7_bs_c_2)
329e6ca3953Spatrick	add	r0, r1, r2
330e6ca3953Spatrick	ldr	r2, [sp, #0]
331e6ca3953Spatrick	add	r1, r2, r3
332e6ca3953Spatrick	ldr	r2, [sp, #4]
333e6ca3953Spatrick	teq	r2, #0
334e6ca3953Spatrick	moveq	pc, lr
335e6ca3953Spatrick
336e6ca3953Spatrick	cmp	r0, r1
337e6ca3953Spatrick	blt	2f
338e6ca3953Spatrick
339e6ca3953Spatrick1:	ldrh	r3, [r0], #2
340e6ca3953Spatrick	strh	r3, [r1], #2
341e6ca3953Spatrick	subs	r2, r2, #1
342e6ca3953Spatrick	bne	1b
34310aa22a0Sjsg	dsb	sy
344e6ca3953Spatrick
345e6ca3953Spatrick	mov	pc, lr
346e6ca3953Spatrick
347e6ca3953Spatrick2:	add	r0, r0, r2, lsl #1
348e6ca3953Spatrick	add	r1, r1, r2, lsl #1
349e6ca3953Spatrick	sub	r0, r0, #2
350e6ca3953Spatrick	sub	r1, r1, #2
351e6ca3953Spatrick
352e6ca3953Spatrick3:	ldrh	r3, [r0], #-2
353e6ca3953Spatrick	strh	r3, [r1], #-2
354e6ca3953Spatrick	subs	r2, r2, #1
355e6ca3953Spatrick	bne	3b
35610aa22a0Sjsg	dsb	sy
357e6ca3953Spatrick
358e6ca3953Spatrick	mov	pc, lr
359