1129198Scognet/*	$NetBSD: bus_space_asm_generic.S,v 1.3 2003/03/27 19:46:14 mycroft Exp $	*/
2129198Scognet
3139735Simp/*-
4129198Scognet * Copyright (c) 1997 Causality Limited.
5129198Scognet * Copyright (c) 1997 Mark Brinicombe.
6129198Scognet * All rights reserved.
7129198Scognet *
8129198Scognet * Redistribution and use in source and binary forms, with or without
9129198Scognet * modification, are permitted provided that the following conditions
10129198Scognet * are met:
11129198Scognet * 1. Redistributions of source code must retain the above copyright
12129198Scognet *    notice, this list of conditions and the following disclaimer.
13129198Scognet * 2. Redistributions in binary form must reproduce the above copyright
14129198Scognet *    notice, this list of conditions and the following disclaimer in the
15129198Scognet *    documentation and/or other materials provided with the distribution.
16129198Scognet * 3. All advertising materials mentioning features or use of this software
17129198Scognet *    must display the following acknowledgement:
18129198Scognet *	This product includes software developed by Mark Brinicombe
19129198Scognet *	for the NetBSD Project.
20129198Scognet * 4. The name of the company nor the name of the author may be used to
21129198Scognet *    endorse or promote products derived from this software without specific
22129198Scognet *    prior written permission.
23129198Scognet *
24129198Scognet * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
25129198Scognet * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
26129198Scognet * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27129198Scognet * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28129198Scognet * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29129198Scognet * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30129198Scognet * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31129198Scognet * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32129198Scognet * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33129198Scognet * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34129198Scognet * SUCH DAMAGE.
35129198Scognet *
36129198Scognet */
37129198Scognet
38129198Scognet#include <machine/asm.h>
39129198Scognet#include <machine/cpuconf.h>
40129198Scognet__FBSDID("$FreeBSD$");
41129198Scognet
42129198Scognet/*
43129198Scognet * Generic bus_space functions.
44129198Scognet */
45129198Scognet
46129198Scognet/*
47129198Scognet * read single
48129198Scognet */
49129198Scognet
50129198ScognetENTRY(generic_bs_r_1)
51129198Scognet	ldrb	r0, [r1, r2]
52137463Scognet	RET
53129198Scognet
54129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0
55129198ScognetENTRY(generic_armv4_bs_r_2)
56129198Scognet	ldrh	r0, [r1, r2]
57137463Scognet	RET
58129198Scognet#endif
59129198Scognet
60129198ScognetENTRY(generic_bs_r_4)
61129198Scognet	ldr	r0, [r1, r2]
62137463Scognet	RET
63129198Scognet
64129198Scognet/*
65129198Scognet * write single
66129198Scognet */
67129198Scognet
68129198ScognetENTRY(generic_bs_w_1)
69129198Scognet	strb	r3, [r1, r2]
70137463Scognet	RET
71129198Scognet
72129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0
73129198ScognetENTRY(generic_armv4_bs_w_2)
74129198Scognet	strh	r3, [r1, r2]
75137463Scognet	RET
76129198Scognet#endif
77129198Scognet
78129198ScognetENTRY(generic_bs_w_4)
79129198Scognet	str	r3, [r1, r2]
80137463Scognet	RET
81129198Scognet
82129198Scognet/*
83129198Scognet * read multiple
84129198Scognet */
85129198Scognet
86129198ScognetENTRY(generic_bs_rm_1)
87129198Scognet	add	r0, r1, r2
88129198Scognet	mov	r1, r3
89129198Scognet	ldr	r2, [sp, #0]
90129198Scognet	teq	r2, #0
91137463Scognet	RETeq
92129198Scognet
93129198Scognet1:	ldrb	r3, [r0]
94129198Scognet	strb	r3, [r1], #1
95129198Scognet	subs	r2, r2, #1
96129198Scognet	bne	1b
97129198Scognet
98137463Scognet	RET
99129198Scognet
100129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0
101129198ScognetENTRY(generic_armv4_bs_rm_2)
102129198Scognet	add	r0, r1, r2
103129198Scognet	mov	r1, r3
104129198Scognet	ldr	r2, [sp, #0]
105129198Scognet	teq	r2, #0
106137463Scognet	RETeq
107129198Scognet
108129198Scognet1:	ldrh	r3, [r0]
109129198Scognet	strh	r3, [r1], #2
110129198Scognet	subs	r2, r2, #1
111129198Scognet	bne	1b
112129198Scognet
113137463Scognet	RET
114129198Scognet#endif
115129198Scognet
116129198ScognetENTRY(generic_bs_rm_4)
117129198Scognet	add	r0, r1, r2
118129198Scognet	mov	r1, r3
119129198Scognet	ldr	r2, [sp, #0]
120129198Scognet	teq	r2, #0
121137463Scognet	RETeq
122129198Scognet
123129198Scognet1:	ldr	r3, [r0]
124129198Scognet	str	r3, [r1], #4
125129198Scognet	subs	r2, r2, #1
126129198Scognet	bne	1b
127129198Scognet
128137463Scognet	RET
129129198Scognet
130129198Scognet/*
131129198Scognet * write multiple
132129198Scognet */
133129198Scognet
134129198ScognetENTRY(generic_bs_wm_1)
135129198Scognet	add	r0, r1, r2
136129198Scognet	mov	r1, r3
137129198Scognet	ldr	r2, [sp, #0]
138129198Scognet	teq	r2, #0
139137463Scognet	RETeq
140129198Scognet
141129198Scognet1:	ldrb	r3, [r1], #1
142129198Scognet	strb	r3, [r0]
143129198Scognet	subs	r2, r2, #1
144129198Scognet	bne	1b
145129198Scognet
146137463Scognet	RET
147129198Scognet
148129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0
149129198ScognetENTRY(generic_armv4_bs_wm_2)
150129198Scognet	add	r0, r1, r2
151129198Scognet	mov	r1, r3
152129198Scognet	ldr	r2, [sp, #0]
153129198Scognet	teq	r2, #0
154137463Scognet	RETeq
155129198Scognet
156129198Scognet1:	ldrh	r3, [r1], #2
157129198Scognet	strh	r3, [r0]
158129198Scognet	subs	r2, r2, #1
159129198Scognet	bne	1b
160129198Scognet
161137463Scognet	RET
162129198Scognet#endif
163129198Scognet
164129198ScognetENTRY(generic_bs_wm_4)
165129198Scognet	add	r0, r1, r2
166129198Scognet	mov	r1, r3
167129198Scognet	ldr	r2, [sp, #0]
168129198Scognet	teq	r2, #0
169137463Scognet	RETeq
170129198Scognet
171129198Scognet1:	ldr	r3, [r1], #4
172129198Scognet	str	r3, [r0]
173129198Scognet	subs	r2, r2, #1
174129198Scognet	bne	1b
175129198Scognet
176137463Scognet	RET
177129198Scognet
178129198Scognet/*
179129198Scognet * read region
180129198Scognet */
181129198Scognet
182129198ScognetENTRY(generic_bs_rr_1)
183129198Scognet	add	r0, r1, r2
184129198Scognet	mov	r1, r3
185129198Scognet	ldr	r2, [sp, #0]
186129198Scognet	teq	r2, #0
187137463Scognet	RETeq
188129198Scognet
189129198Scognet1:	ldrb	r3, [r0], #1
190129198Scognet	strb	r3, [r1], #1
191129198Scognet	subs	r2, r2, #1
192129198Scognet	bne	1b
193129198Scognet
194137463Scognet	RET
195129198Scognet
196129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0
197129198ScognetENTRY(generic_armv4_bs_rr_2)
198129198Scognet	add	r0, r1, r2
199129198Scognet	mov	r1, r3
200129198Scognet	ldr	r2, [sp, #0]
201129198Scognet	teq	r2, #0
202137463Scognet	RETeq
203129198Scognet
204129198Scognet1:	ldrh	r3, [r0], #2
205129198Scognet	strh	r3, [r1], #2
206129198Scognet	subs	r2, r2, #1
207129198Scognet	bne	1b
208129198Scognet
209137463Scognet	RET
210129198Scognet#endif
211129198Scognet
212129198ScognetENTRY(generic_bs_rr_4)
213129198Scognet	add	r0, r1, r2
214129198Scognet	mov	r1, r3
215129198Scognet	ldr	r2, [sp, #0]
216129198Scognet	teq	r2, #0
217137463Scognet	RETeq
218129198Scognet
219129198Scognet1:	ldr	r3, [r0], #4
220129198Scognet	str	r3, [r1], #4
221129198Scognet	subs	r2, r2, #1
222129198Scognet	bne	1b
223129198Scognet
224137463Scognet	RET
225129198Scognet
226129198Scognet/*
227129198Scognet * write region.
228129198Scognet */
229129198Scognet
230129198ScognetENTRY(generic_bs_wr_1)
231129198Scognet	add	r0, r1, r2
232129198Scognet	mov	r1, r3
233129198Scognet	ldr	r2, [sp, #0]
234129198Scognet	teq	r2, #0
235137463Scognet	RETeq
236129198Scognet
237129198Scognet1:	ldrb	r3, [r1], #1
238129198Scognet	strb	r3, [r0], #1
239129198Scognet	subs	r2, r2, #1
240129198Scognet	bne	1b
241129198Scognet
242137463Scognet	RET
243129198Scognet
244129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0
245129198ScognetENTRY(generic_armv4_bs_wr_2)
246129198Scognet	add	r0, r1, r2
247129198Scognet	mov	r1, r3
248129198Scognet	ldr	r2, [sp, #0]
249129198Scognet	teq	r2, #0
250137463Scognet	RETeq
251129198Scognet
252129198Scognet1:	ldrh	r3, [r1], #2
253129198Scognet	strh	r3, [r0], #2
254129198Scognet	subs	r2, r2, #1
255129198Scognet	bne	1b
256129198Scognet
257137463Scognet	RET
258129198Scognet#endif
259129198Scognet
260129198ScognetENTRY(generic_bs_wr_4)
261129198Scognet	add	r0, r1, r2
262129198Scognet	mov	r1, r3
263129198Scognet	ldr	r2, [sp, #0]
264129198Scognet	teq	r2, #0
265137463Scognet	RETeq
266129198Scognet
267129198Scognet1:	ldr	r3, [r1], #4
268129198Scognet	str	r3, [r0], #4
269129198Scognet	subs	r2, r2, #1
270129198Scognet	bne	1b
271129198Scognet
272137463Scognet	RET
273129198Scognet
274129198Scognet/*
275129198Scognet * set region
276129198Scognet */
277129198Scognet
278129198ScognetENTRY(generic_bs_sr_1)
279129198Scognet	add	r0, r1, r2
280129198Scognet	mov	r1, r3
281129198Scognet	ldr	r2, [sp, #0]
282129198Scognet	teq	r2, #0
283137463Scognet	RETeq
284129198Scognet
285129198Scognet1:	strb	r1, [r0], #1
286129198Scognet	subs	r2, r2, #1
287129198Scognet	bne	1b
288129198Scognet
289137463Scognet	RET
290129198Scognet
291129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0
292129198ScognetENTRY(generic_armv4_bs_sr_2)
293129198Scognet	add	r0, r1, r2
294129198Scognet	mov	r1, r3
295129198Scognet	ldr	r2, [sp, #0]
296129198Scognet	teq	r2, #0
297137463Scognet	RETeq
298129198Scognet
299129198Scognet1:	strh	r1, [r0], #2
300129198Scognet	subs	r2, r2, #1
301129198Scognet	bne	1b
302129198Scognet
303137463Scognet	RET
304129198Scognet#endif
305129198Scognet
306129198ScognetENTRY(generic_bs_sr_4)
307129198Scognet	add	r0, r1, r2
308129198Scognet	mov	r1, r3
309129198Scognet	ldr	r2, [sp, #0]
310129198Scognet	teq	r2, #0
311137463Scognet	RETeq
312129198Scognet
313129198Scognet1:	str	r1, [r0], #4
314129198Scognet	subs	r2, r2, #1
315129198Scognet	bne	1b
316129198Scognet
317137463Scognet	RET
318129198Scognet
319129198Scognet/*
320129198Scognet * copy region
321129198Scognet */
322129198Scognet
323129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0
324129198ScognetENTRY(generic_armv4_bs_c_2)
325129198Scognet	add	r0, r1, r2
326129198Scognet	ldr	r2, [sp, #0]
327129198Scognet	add	r1, r2, r3
328129198Scognet	ldr	r2, [sp, #4]
329129198Scognet	teq	r2, #0
330137463Scognet	RETeq
331129198Scognet
332129198Scognet	cmp	r0, r1
333129198Scognet	blt	2f
334129198Scognet
335129198Scognet1:	ldrh	r3, [r0], #2
336129198Scognet	strh	r3, [r1], #2
337129198Scognet	subs	r2, r2, #1
338129198Scognet	bne	1b
339129198Scognet
340137463Scognet	RET
341129198Scognet
342129198Scognet2:	add	r0, r0, r2, lsl #1
343129198Scognet	add	r1, r1, r2, lsl #1
344129198Scognet	sub	r0, r0, #2
345129198Scognet	sub	r1, r1, #2
346129198Scognet
347129198Scognet3:	ldrh	r3, [r0], #-2
348129198Scognet	strh	r3, [r1], #-2
349129198Scognet	subs	r2, r2, #1
350129198Scognet	bne	3b
351129198Scognet
352137463Scognet	RET
353129198Scognet#endif
354