xref: /netbsd-src/sys/arch/mac68k/mac68k/bus_space.c (revision ed33e2372124983dd9432b46b58ee89f7b22b688)
1 /*	$NetBSD: bus_space.c,v 1.32 2013/10/19 19:08:39 martin Exp $	*/
2 
3 /*-
4  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9  * NASA Ames Research Center.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /*
34  * Implementation of bus_space mapping for mac68k.
35  */
36 
37 #include <sys/cdefs.h>
38 __KERNEL_RCSID(0, "$NetBSD: bus_space.c,v 1.32 2013/10/19 19:08:39 martin Exp $");
39 
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/extent.h>
43 
44 #include <machine/bus.h>
45 #include <machine/cpu.h>
46 #include <m68k/cacheops.h>
47 
48 #include <uvm/uvm_extern.h>
49 
50 int	bus_mem_add_mapping(bus_addr_t, bus_size_t, int, bus_space_handle_t *);
51 
52 extern struct extent *iomem_ex;
53 extern int iomem_malloc_safe;
54 label_t *nofault;
55 
56 int
bus_mem_add_mapping(bus_addr_t bpa,bus_size_t size,int flags,bus_space_handle_t * hp)57 bus_mem_add_mapping(bus_addr_t bpa, bus_size_t size, int flags,
58 		    bus_space_handle_t *hp)
59 {
60 	u_long pa, endpa;
61 	vaddr_t va;
62 	pt_entry_t *pte;
63 
64 	pa = m68k_trunc_page(bpa);
65 	endpa = m68k_round_page((bpa + size) - 1);
66 
67 #ifdef DIAGNOSTIC
68 	if (endpa <= pa)
69 		panic("bus_mem_add_mapping: overflow");
70 #endif
71 
72 	va = uvm_km_alloc(kernel_map, endpa - pa, 0,
73 	    UVM_KMF_VAONLY | UVM_KMF_NOWAIT);
74 	if (va == 0)
75 		return (ENOMEM);
76 
77 	hp->base = (u_long)(va + m68k_page_offset(bpa));
78 	hp->swapped = 0;
79 	hp->stride = 1;
80 	hp->bsr1 = mac68k_bsr1;
81 	hp->bsr2 = mac68k_bsr2;
82 	hp->bsr4 = mac68k_bsr4;
83 	hp->bsrs1 = mac68k_bsr1;
84 	hp->bsrs2 = mac68k_bsr2;
85 	hp->bsrs4 = mac68k_bsr4;
86 	hp->bsrm1 = mac68k_bsrm1;
87 	hp->bsrm2 = mac68k_bsrm2;
88 	hp->bsrm4 = mac68k_bsrm4;
89 	hp->bsrms1 = mac68k_bsrm1;
90 	hp->bsrms2 = mac68k_bsrm2;
91 	hp->bsrms4 = mac68k_bsrm4;
92 	hp->bsrr1 = mac68k_bsrr1;
93 	hp->bsrr2 = mac68k_bsrr2;
94 	hp->bsrr4 = mac68k_bsrr4;
95 	hp->bsrrs1 = mac68k_bsrr1;
96 	hp->bsrrs2 = mac68k_bsrr2;
97 	hp->bsrrs4 = mac68k_bsrr4;
98 	hp->bsw1 = mac68k_bsw1;
99 	hp->bsw2 = mac68k_bsw2;
100 	hp->bsw4 = mac68k_bsw4;
101 	hp->bsws1 = mac68k_bsw1;
102 	hp->bsws2 = mac68k_bsw2;
103 	hp->bsws4 = mac68k_bsw4;
104 	hp->bswm1 = mac68k_bswm1;
105 	hp->bswm2 = mac68k_bswm2;
106 	hp->bswm4 = mac68k_bswm4;
107 	hp->bswms1 = mac68k_bswm1;
108 	hp->bswms2 = mac68k_bswm2;
109 	hp->bswms4 = mac68k_bswm4;
110 	hp->bswr1 = mac68k_bswr1;
111 	hp->bswr2 = mac68k_bswr2;
112 	hp->bswr4 = mac68k_bswr4;
113 	hp->bswrs1 = mac68k_bswr1;
114 	hp->bswrs2 = mac68k_bswr2;
115 	hp->bswrs4 = mac68k_bswr4;
116 	hp->bssm1 = mac68k_bssm1;
117 	hp->bssm2 = mac68k_bssm2;
118 	hp->bssm4 = mac68k_bssm4;
119 	hp->bssr1 = mac68k_bssr1;
120 	hp->bssr2 = mac68k_bssr2;
121 	hp->bssr4 = mac68k_bssr4;
122 
123 	for (; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) {
124 		pmap_enter(pmap_kernel(), va, pa,
125 		    VM_PROT_READ | VM_PROT_WRITE, PMAP_WIRED);
126 		pte = kvtopte(va);
127 		if ((flags & BUS_SPACE_MAP_CACHEABLE))
128 			*pte &= ~PG_CI;
129 		else
130 			*pte |= PG_CI;
131 		TBIS(va);
132 	}
133 	pmap_update(pmap_kernel());
134 
135 	return 0;
136 }
137 
138 int
bus_space_map(bus_space_tag_t t,bus_addr_t bpa,bus_size_t size,int flags,bus_space_handle_t * hp)139 bus_space_map(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size, int flags,
140 	      bus_space_handle_t *hp)
141 {
142 #ifdef DIAGNOSTIC
143 	paddr_t pa, endpa;
144 #endif
145 	int error;
146 
147 	/*
148 	 * Before we go any further, let's make sure that this
149 	 * region is available.
150 	 */
151 	error = extent_alloc_region(iomem_ex, bpa, size,
152 	    EX_NOWAIT | (iomem_malloc_safe ? EX_MALLOCOK : 0));
153 	if (error)
154 		return (error);
155 
156 #ifdef DIAGNOSTIC
157 	pa = m68k_trunc_page(bpa + t);
158 	endpa = m68k_round_page((bpa + t + size) - 1);
159 
160 	if (endpa <= pa)
161 		panic("bus_space_map: overflow");
162 #endif
163 
164 	error = bus_mem_add_mapping(bpa, size, flags, hp);
165 	if (error) {
166 		if (extent_free(iomem_ex, bpa, size, EX_NOWAIT |
167 		    (iomem_malloc_safe ? EX_MALLOCOK : 0))) {
168 			printf("bus_space_map: pa 0x%lx, size 0x%lx\n",
169 			    bpa, size);
170 			printf("bus_space_map: can't free region\n");
171 		}
172 	}
173 
174 	return (error);
175 }
176 
177 int
bus_space_alloc(bus_space_tag_t t,bus_addr_t rstart,bus_addr_t rend,bus_size_t size,bus_size_t alignment,bus_size_t boundary,int flags,bus_addr_t * bpap,bus_space_handle_t * hp)178 bus_space_alloc(bus_space_tag_t t,
179 		bus_addr_t rstart, bus_addr_t rend, bus_size_t size,
180 		bus_size_t alignment, bus_size_t boundary, int flags,
181 		bus_addr_t *bpap, bus_space_handle_t *hp)
182 {
183 	u_long bpa;
184 	int error;
185 
186 	/*
187 	 * Sanity check the allocation against the extent's boundaries.
188 	 */
189 	if (rstart < iomem_ex->ex_start || rend > iomem_ex->ex_end)
190 		panic("bus_space_alloc: bad region start/end");
191 
192 	/*
193 	 * Do the requested allocation.
194 	 */
195 	error = extent_alloc_subregion(iomem_ex, rstart, rend, size, alignment,
196 	    boundary,
197 	    EX_FAST | EX_NOWAIT | (iomem_malloc_safe ?  EX_MALLOCOK : 0),
198 	    &bpa);
199 
200 	if (error)
201 		return (error);
202 
203 	/*
204 	 * For memory space, map the bus physical address to
205 	 * a kernel virtual address.
206 	 */
207 	error = bus_mem_add_mapping(bpa, size, flags, hp);
208 	if (error) {
209 		if (extent_free(iomem_ex, bpa, size, EX_NOWAIT |
210 		    (iomem_malloc_safe ? EX_MALLOCOK : 0))) {
211 			printf("bus_space_alloc: pa 0x%lx, size 0x%lx\n",
212 			    bpa, size);
213 			printf("bus_space_alloc: can't free region\n");
214 		}
215 	}
216 
217 	*bpap = bpa;
218 
219 	return (error);
220 }
221 
222 void
bus_space_unmap(bus_space_tag_t t,bus_space_handle_t h,bus_size_t size)223 bus_space_unmap(bus_space_tag_t t, bus_space_handle_t h, bus_size_t size)
224 {
225 	vaddr_t va, endva;
226 	bus_addr_t bpa;
227 
228 	va = m68k_trunc_page(h.base);
229 	endva = m68k_round_page((h.base + size) - 1);
230 
231 #ifdef DIAGNOSTIC
232 	if (endva <= va)
233 		panic("bus_space_unmap: overflow");
234 #endif
235 
236 	(void) pmap_extract(pmap_kernel(), va, &bpa);
237 	bpa += m68k_page_offset(h.base);
238 
239 	/*
240 	 * Free the kernel virtual mapping.
241 	 */
242 	pmap_kremove(va, endva - va);
243 	uvm_km_free(kernel_map, va, endva - va, UVM_KMF_VAONLY);
244 
245 	if (extent_free(iomem_ex, bpa, size,
246 	    EX_NOWAIT | (iomem_malloc_safe ? EX_MALLOCOK : 0))) {
247 		printf("bus_space_unmap: pa 0x%lx, size 0x%lx\n",
248 		    bpa, size);
249 		printf("bus_space_unmap: can't free region\n");
250 	}
251 }
252 
253 void
bus_space_free(bus_space_tag_t t,bus_space_handle_t h,bus_size_t size)254 bus_space_free(bus_space_tag_t t, bus_space_handle_t h, bus_size_t size)
255 {
256 	/* bus_space_unmap() does all that we need to do. */
257 	bus_space_unmap(t, h, size);
258 }
259 
260 int
bus_space_subregion(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,bus_size_t size,bus_space_handle_t * nhp)261 bus_space_subregion(bus_space_tag_t t, bus_space_handle_t h, bus_size_t offset,
262 		    bus_size_t size, bus_space_handle_t *nhp)
263 {
264 
265 	*nhp = h;
266 	nhp->base += offset;
267 	return (0);
268 }
269 
270 int
mac68k_bus_space_probe(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,int size)271 mac68k_bus_space_probe(bus_space_tag_t t, bus_space_handle_t h,
272 		       bus_size_t offset, int size)
273 {
274 	label_t faultbuf;
275 
276 	nofault = &faultbuf;
277 	if (setjmp(nofault)) {
278 		nofault = (label_t *)0;
279 		return (0);
280 	}
281 
282 	switch (size) {
283 	case 1:
284 		bus_space_read_1(t, h, offset);
285 		break;
286 	case 2:
287 		bus_space_read_2(t, h, offset);
288 		break;
289 	case 4:
290 		bus_space_read_4(t, h, offset);
291 		break;
292 	case 8:
293 	default:
294 		panic("bus_space_probe: unsupported data size %d", size);
295 		/* NOTREACHED */
296 	}
297 
298 	nofault = (label_t *)0;
299 	return (1);
300 }
301 
302 void
mac68k_bus_space_handle_swapped(bus_space_tag_t t,bus_space_handle_t * h)303 mac68k_bus_space_handle_swapped(bus_space_tag_t t, bus_space_handle_t *h)
304 {
305 	h->swapped = 1;
306 	if (h->stride == 1) {
307 		h->bsr2 = mac68k_bsr2_swap;
308 		h->bsr4 = mac68k_bsr4_swap;
309 		h->bsrm2 = mac68k_bsrm2_swap;
310 		h->bsrm4 = mac68k_bsrm4_swap;
311 		h->bsrr2 = mac68k_bsrr2_swap;
312 		h->bsrr4 = mac68k_bsrr4_swap;
313 		h->bsw2 = mac68k_bsw2_swap;
314 		h->bsw4 = mac68k_bsw4_swap;
315 		h->bswm2 = mac68k_bswm2_swap;
316 		h->bswm4 = mac68k_bswm4_swap;
317 		h->bswr2 = mac68k_bswr2_swap;
318 		h->bswr4 = mac68k_bswr4_swap;
319 		h->bssm2 = mac68k_bssm2_swap;
320 		h->bssm4 = mac68k_bssm4_swap;
321 		h->bssr2 = mac68k_bssr2_swap;
322 		h->bssr4 = mac68k_bssr4_swap;
323 	}
324 }
325 
326 void
mac68k_bus_space_handle_set_stride(bus_space_tag_t t,bus_space_handle_t * h,int stride)327 mac68k_bus_space_handle_set_stride(bus_space_tag_t t, bus_space_handle_t *h,
328 				   int stride)
329 {
330 	h->stride = stride;
331 	h->bsr1 = mac68k_bsr1_gen;
332 	h->bsr2 = mac68k_bsr2_gen;
333 	h->bsr4 = mac68k_bsr4_gen;
334 	h->bsrs2 = mac68k_bsrs2_gen;
335 	h->bsrs4 = mac68k_bsrs4_gen;
336 	h->bsrm1 = mac68k_bsrm1_gen;
337 	h->bsrm2 = mac68k_bsrm2_gen;
338 	h->bsrm4 = mac68k_bsrm4_gen;
339 	h->bsrms2 = mac68k_bsrms2_gen;
340 	h->bsrms4 = mac68k_bsrms4_gen;
341 	h->bsrr1 = mac68k_bsrr1_gen;
342 	h->bsrr2 = mac68k_bsrr2_gen;
343 	h->bsrr4 = mac68k_bsrr4_gen;
344 	h->bsrrs2 = mac68k_bsrrs2_gen;
345 	h->bsrrs4 = mac68k_bsrrs4_gen;
346 	h->bsw1 = mac68k_bsw1_gen;
347 	h->bsw2 = mac68k_bsw2_gen;
348 	h->bsw4 = mac68k_bsw4_gen;
349 	h->bsws2 = mac68k_bsws2_gen;
350 	h->bsws4 = mac68k_bsws4_gen;
351 	h->bswm2 = mac68k_bswm2_gen;
352 	h->bswm4 = mac68k_bswm4_gen;
353 	h->bswms2 = mac68k_bswms2_gen;
354 	h->bswms4 = mac68k_bswms4_gen;
355 	h->bswr1 = mac68k_bswr1_gen;
356 	h->bswr2 = mac68k_bswr2_gen;
357 	h->bswr4 = mac68k_bswr4_gen;
358 	h->bswrs2 = mac68k_bswrs2_gen;
359 	h->bswrs4 = mac68k_bswrs4_gen;
360 	h->bssm1 = mac68k_bssm1_gen;
361 	h->bssm2 = mac68k_bssm2_gen;
362 	h->bssm4 = mac68k_bssm4_gen;
363 	h->bssr1 = mac68k_bssr1_gen;
364 	h->bssr2 = mac68k_bssr2_gen;
365 	h->bssr4 = mac68k_bssr4_gen;
366 }
367 
368 u_int8_t
mac68k_bsr1(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset)369 mac68k_bsr1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset)
370 {
371 	return (*(volatile u_int8_t *)(h->base + offset));
372 }
373 
374 u_int8_t
mac68k_bsr1_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset)375 mac68k_bsr1_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset)
376 {
377 	return (*(volatile u_int8_t *)(h->base + offset * h->stride));
378 }
379 
380 u_int16_t
mac68k_bsr2(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset)381 mac68k_bsr2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset)
382 {
383 	return (*(volatile u_int16_t *)(h->base + offset));
384 }
385 
386 u_int16_t
mac68k_bsr2_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset)387 mac68k_bsr2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset)
388 {
389 	u_int16_t	v;
390 
391 	v = (*(volatile u_int16_t *)(h->base + offset));
392 	return bswap16(v);
393 }
394 
395 u_int16_t
mac68k_bsrs2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset)396 mac68k_bsrs2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset)
397 {
398 	u_int16_t	v;
399 
400 	v = (*(volatile u_int8_t *)(h->base + offset++ * h->stride)) << 8;
401 	v |= (*(volatile u_int8_t *)(h->base + offset * h->stride));
402 	return v;
403 }
404 
405 u_int16_t
mac68k_bsr2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset)406 mac68k_bsr2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset)
407 {
408 	u_int16_t	v;
409 
410 	v = mac68k_bsrs2_gen(t, h, offset);
411 	if (h->swapped) {
412 		v = bswap16(v);
413 	}
414 	return v;
415 }
416 
417 u_int32_t
mac68k_bsr4(bus_space_tag_t tag,bus_space_handle_t * h,bus_size_t offset)418 mac68k_bsr4(bus_space_tag_t tag, bus_space_handle_t *h, bus_size_t offset)
419 {
420 	return (*(volatile u_int32_t *)(h->base + offset));
421 }
422 
423 u_int32_t
mac68k_bsr4_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset)424 mac68k_bsr4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset)
425 {
426 	u_int32_t	v;
427 
428 	v = (*(volatile u_int32_t *)(h->base + offset));
429 	return bswap32(v);
430 }
431 
432 u_int32_t
mac68k_bsrs4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset)433 mac68k_bsrs4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset)
434 {
435 	u_int32_t	v;
436 
437 	v = (*(volatile u_int8_t *)(h->base + offset++ * h->stride));
438 	v <<= 8;
439 	v |= (*(volatile u_int8_t *)(h->base + offset++ * h->stride));
440 	v <<= 8;
441 	v |= (*(volatile u_int8_t *)(h->base + offset++ * h->stride));
442 	v <<= 8;
443 	v |= (*(volatile u_int8_t *)(h->base + offset++ * h->stride));
444 	return v;
445 }
446 
447 u_int32_t
mac68k_bsr4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset)448 mac68k_bsr4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset)
449 {
450 	u_int32_t	v;
451 
452 	v = mac68k_bsrs4_gen(t, h, offset);
453 	if (h->swapped) {
454 		v = bswap32(v);
455 	}
456 	return v;
457 }
458 
459 void
mac68k_bsrm1(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int8_t * a,size_t c)460 mac68k_bsrm1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
461 	     u_int8_t *a, size_t c)
462 {
463 	__asm volatile (
464 	"	movl	%0,%%a0		;"
465 	"	movl	%1,%%a1		;"
466 	"	movl	%2,%%d0		;"
467 	"1:	movb	%%a0@,%%a1@+	;"
468 	"	subql	#1,%%d0		;"
469 	"	jne	1b"					:
470 								:
471 		    "r" (h->base + offset), "g" (a), "g" (c)	:
472 		    "a0","a1","d0");
473 }
474 
475 void
mac68k_bsrm1_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int8_t * a,size_t c)476 mac68k_bsrm1_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
477 		 u_int8_t *a, size_t c)
478 {
479 	while (c--) {
480 		*a++ = bus_space_read_1(t, *h, offset);
481 	}
482 }
483 
484 void
mac68k_bsrm2(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t * a,size_t c)485 mac68k_bsrm2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
486 	     u_int16_t *a, size_t c)
487 {
488 	__asm volatile (
489 	"	movl	%0,%%a0		;"
490 	"	movl	%1,%%a1		;"
491 	"	movl	%2,%%d0		;"
492 	"1:	movw	%%a0@,%%a1@+	;"
493 	"	subql	#1,%%d0		;"
494 	"	jne	1b"					:
495 								:
496 		    "r" (h->base + offset), "g" (a), "g" (c)	:
497 		    "a0","a1","d0");
498 }
499 
500 void
mac68k_bsrm2_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t * a,size_t c)501 mac68k_bsrm2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
502 		  u_int16_t *a, size_t c)
503 {
504 	__asm volatile (
505 	"	movl	%0,%%a0		;"
506 	"	movl	%1,%%a1		;"
507 	"	movl	%2,%%d0		;"
508 	"1:	movw	%%a0@,%%d1	;"
509 	"	rolw	#8,%%d1		;"
510 	"	movw	%%d1,%%a1@+	;"
511 	"	subql	#1,%%d0		;"
512 	"	jne	1b"					:
513 								:
514 		    "r" (h->base + offset), "g" (a), "g" (c)	:
515 		    "a0","a1","d0","d1");
516 }
517 
518 void
mac68k_bsrm2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t * a,size_t c)519 mac68k_bsrm2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
520 		 u_int16_t *a, size_t c)
521 {
522 	while (c--) {
523 		*a++ = bus_space_read_2(t, *h, offset);
524 	}
525 }
526 
527 void
mac68k_bsrms2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t * a,size_t c)528 mac68k_bsrms2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
529 		  u_int16_t *a, size_t c)
530 {
531 	while (c--) {
532 		*a++ = bus_space_read_stream_2(t, *h, offset);
533 	}
534 }
535 
536 void
mac68k_bsrm4(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t * a,size_t c)537 mac68k_bsrm4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
538 	     u_int32_t *a, size_t c)
539 {
540 	__asm volatile (
541 	"	movl	%0,%%a0		;"
542 	"	movl	%1,%%a1		;"
543 	"	movl	%2,%%d0		;"
544 	"1:	movl	%%a0@,%%a1@+	;"
545 	"	subql	#1,%%d0		;"
546 	"	jne	1b"					:
547 								:
548 		    "r" (h->base + offset), "g" (a), "g" (c)	:
549 		    "a0","a1","d0");
550 }
551 
552 void
mac68k_bsrm4_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t * a,size_t c)553 mac68k_bsrm4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
554 		  u_int32_t *a, size_t c)
555 {
556 	__asm volatile (
557 	"	movl	%0,%%a0		;"
558 	"	movl	%1,%%a1		;"
559 	"	movl	%2,%%d0		;"
560 	"1:	movl	%%a0@,%%d1	;"
561 	"	rolw	#8,%%d1		;"
562 	"	swap	%%d1		;"
563 	"	rolw	#8,%%d1		;"
564 	"	movl	%%d1,%%a1@+	;"
565 	"	subql	#1,%%d0		;"
566 	"	jne	1b"					:
567 								:
568 		    "r" (h->base + offset), "g" (a), "g" (c)	:
569 		    "a0","a1","d0","d1");
570 }
571 
572 void
mac68k_bsrm4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t * a,size_t c)573 mac68k_bsrm4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
574 		 u_int32_t *a, size_t c)
575 {
576 	while (c--) {
577 		*a++ = bus_space_read_4(t, *h, offset);
578 	}
579 }
580 
581 void
mac68k_bsrms4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t * a,size_t c)582 mac68k_bsrms4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
583 		  u_int32_t *a, size_t c)
584 {
585 	while (c--) {
586 		*a++ = bus_space_read_stream_4(t, *h, offset);
587 	}
588 }
589 
590 void
mac68k_bsrr1(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int8_t * a,size_t c)591 mac68k_bsrr1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
592 	     u_int8_t *a, size_t c)
593 {
594 	__asm volatile (
595 	"	movl	%0,%%a0		;"
596 	"	movl	%1,%%a1		;"
597 	"	movl	%2,%%d0		;"
598 	"1:	movb	%%a0@+,%%a1@+	;"
599 	"	subql	#1,%%d0		;"
600 	"	jne	1b"					:
601 								:
602 		    "r" (h->base + offset), "g" (a), "g" (c)	:
603 		    "a0","a1","d0");
604 }
605 
606 void
mac68k_bsrr1_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int8_t * a,size_t c)607 mac68k_bsrr1_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
608 		 u_int8_t *a, size_t c)
609 {
610 	while (c--) {
611 		*a++ = bus_space_read_1(t, *h, offset);
612 		offset++;
613 	}
614 }
615 
616 void
mac68k_bsrr2(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t * a,size_t c)617 mac68k_bsrr2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
618 	     u_int16_t *a, size_t c)
619 {
620 	__asm volatile (
621 	"	movl	%0,%%a0		;"
622 	"	movl	%1,%%a1		;"
623 	"	movl	%2,%%d0		;"
624 	"1:	movw	%%a0@+,%%a1@+	;"
625 	"	subql	#1,%%d0		;"
626 	"	jne	1b"					:
627 								:
628 		    "r" (h->base + offset), "g" (a), "g" (c)	:
629 		    "a0","a1","d0");
630 }
631 
632 void
mac68k_bsrr2_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t * a,size_t c)633 mac68k_bsrr2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
634 		  u_int16_t *a, size_t c)
635 {
636 	__asm volatile (
637 	"	movl	%0,%%a0		;"
638 	"	movl	%1,%%a1		;"
639 	"	movl	%2,%%d0		;"
640 	"1:	movw	%%a0@+,%%d1	;"
641 	"	rolw	#8,%%d1		;"
642 	"	movw	%%d1,%%a1@+	;"
643 	"	subql	#1,%%d0		;"
644 	"	jne	1b"					:
645 								:
646 		    "r" (h->base + offset), "g" (a), "g" (c)	:
647 		    "a0","a1","d0","d1");
648 }
649 
650 void
mac68k_bsrr2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t * a,size_t c)651 mac68k_bsrr2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
652 		 u_int16_t *a, size_t c)
653 {
654 	while (c--) {
655 		*a++ = bus_space_read_2(t, *h, offset);
656 		offset += 2;
657 	}
658 }
659 
660 void
mac68k_bsrrs2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t * a,size_t c)661 mac68k_bsrrs2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
662 		  u_int16_t *a, size_t c)
663 {
664 	while (c--) {
665 		*a++ = bus_space_read_stream_2(t, *h, offset);
666 		offset += 2;
667 	}
668 }
669 
670 void
mac68k_bsrr4(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t * a,size_t c)671 mac68k_bsrr4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
672 	     u_int32_t *a, size_t c)
673 {
674 	__asm volatile (
675 	"	movl	%0,%%a0		;"
676 	"	movl	%1,%%a1		;"
677 	"	movl	%2,%%d0		;"
678 	"1:	movl	%%a0@+,%%a1@+	;"
679 	"	subql	#1,%%d0		;"
680 	"	jne	1b"					:
681 								:
682 		    "r" (h->base + offset), "g" (a), "g" (c)	:
683 		    "a0","a1","d0");
684 }
685 
686 void
mac68k_bsrr4_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t * a,size_t c)687 mac68k_bsrr4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
688 		  u_int32_t *a, size_t c)
689 {
690 	__asm volatile (
691 	"	movl	%0,%%a0		;"
692 	"	movl	%1,%%a1		;"
693 	"	movl	%2,%%d0		;"
694 	"1:	movl	%%a0@+,%%d1	;"
695 	"	rolw	#8,%%d1		;"
696 	"	swap	%%d1		;"
697 	"	rolw	#8,%%d1		;"
698 	"	movl	%%d1,%%a1@+	;"
699 	"	subql	#1,%%d0		;"
700 	"	jne	1b"					:
701 								:
702 		    "r" (h->base + offset), "g" (a), "g" (c)	:
703 		    "a0","a1","d0");
704 }
705 
706 void
mac68k_bsrr4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t * a,size_t c)707 mac68k_bsrr4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
708 		 u_int32_t *a, size_t c)
709 {
710 	while (c--) {
711 		*a++ = bus_space_read_4(t, *h, offset);
712 		offset += 4;
713 	}
714 }
715 
716 void
mac68k_bsrrs4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t * a,size_t c)717 mac68k_bsrrs4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
718 		  u_int32_t *a, size_t c)
719 {
720 	while (c--) {
721 		*a++ = bus_space_read_stream_4(t, *h, offset);
722 		offset += 4;
723 	}
724 }
725 
726 void
mac68k_bsw1(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int8_t v)727 mac68k_bsw1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
728 	    u_int8_t v)
729 {
730 	(*(volatile u_int8_t *)(h->base + offset)) = v;
731 }
732 
733 void
mac68k_bsw1_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int8_t v)734 mac68k_bsw1_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
735 		u_int8_t v)
736 {
737 	(*(volatile u_int8_t *)(h->base + offset * h->stride)) = v;
738 }
739 
740 void
mac68k_bsw2(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t v)741 mac68k_bsw2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
742 	    u_int16_t v)
743 {
744 	(*(volatile u_int16_t *)(h->base + offset)) = v;
745 }
746 
747 void
mac68k_bsw2_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t v)748 mac68k_bsw2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
749 		 u_int16_t v)
750 {
751 	v = bswap16(v);
752 	(*(volatile u_int16_t *)(h->base + offset)) = v;
753 }
754 
755 void
mac68k_bsws2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t v)756 mac68k_bsws2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
757 		 u_int16_t v)
758 {
759 	u_int8_t	v1;
760 
761 	v1 = (v & 0xff00) >> 8;
762 	(*(volatile u_int8_t *)(h->base + offset++ * h->stride)) = v1;
763 	(*(volatile u_int8_t *)(h->base + offset * h->stride)) = v & 0xff;
764 }
765 
766 void
mac68k_bsw2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t v)767 mac68k_bsw2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
768 		u_int16_t v)
769 {
770 	if (h->swapped) {
771 		v = bswap16(v);
772 	}
773 	mac68k_bsws2_gen(t, h, offset, v);
774 }
775 
776 void
mac68k_bsw4(bus_space_tag_t tag,bus_space_handle_t * h,bus_size_t offset,u_int32_t v)777 mac68k_bsw4(bus_space_tag_t tag, bus_space_handle_t *h, bus_size_t offset,
778 	    u_int32_t v)
779 {
780 	(*(volatile u_int32_t *)(h->base + offset)) = v;
781 }
782 
783 void
mac68k_bsw4_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t v)784 mac68k_bsw4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
785 		 u_int32_t v)
786 {
787 	v = bswap32(v);
788 	(*(volatile u_int32_t *)(h->base + offset)) = v;
789 }
790 
791 void
mac68k_bsws4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t v)792 mac68k_bsws4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
793 		 u_int32_t v)
794 {
795 	u_int8_t	v1,v2,v3;
796 
797 	v1 = (v & 0xff000000) >> 24;
798 	v2 = (v & 0x00ff0000) >> 16;
799 	v3 = (v & 0x0000ff00) >> 8;
800 	(*(volatile u_int8_t *)(h->base + offset++ * h->stride)) = v1;
801 	(*(volatile u_int8_t *)(h->base + offset++ * h->stride)) = v2;
802 	(*(volatile u_int8_t *)(h->base + offset++ * h->stride)) = v3;
803 	(*(volatile u_int8_t *)(h->base + offset * h->stride)) = v & 0xff;
804 }
805 
806 void
mac68k_bsw4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t v)807 mac68k_bsw4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
808 		 u_int32_t v)
809 {
810 	if (h->swapped) {
811 		v = bswap32(v);
812 	}
813 	mac68k_bsws4_gen(t, h, offset, v);
814 }
815 
816 void
mac68k_bswm1(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int8_t * a,size_t c)817 mac68k_bswm1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
818 	     const u_int8_t *a, size_t c)
819 {
820 	__asm volatile (
821 	"	movl	%0,%%a0		;"
822 	"	movl	%1,%%a1		;"
823 	"	movl	%2,%%d0		;"
824 	"1:	movb	%%a1@+,%%a0@	;"
825 	"	subql	#1,%%d0		;"
826 	"	jne	1b"					:
827 								:
828 		    "r" (h->base + offset), "g" (a), "g" (c)	:
829 		    "a0","a1","d0");
830 }
831 
832 void
mac68k_bswm1_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int8_t * a,size_t c)833 mac68k_bswm1_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
834 		 const u_int8_t *a, size_t c)
835 {
836 	while (c--) {
837 		bus_space_write_1(t, *h, offset, *a++);
838 	}
839 }
840 
841 void
mac68k_bswm2(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int16_t * a,size_t c)842 mac68k_bswm2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
843 	     const u_int16_t *a, size_t c)
844 {
845 	__asm volatile (
846 	"	movl	%0,%%a0		;"
847 	"	movl	%1,%%a1		;"
848 	"	movl	%2,%%d0		;"
849 	"1:	movw	%%a1@+,%%a0@	;"
850 	"	subql	#1,%%d0		;"
851 	"	jne	1b"					:
852 								:
853 		    "r" (h->base + offset), "g" (a), "g" (c)	:
854 		    "a0","a1","d0");
855 }
856 
857 void
mac68k_bswm2_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int16_t * a,size_t c)858 mac68k_bswm2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
859 		  const u_int16_t *a, size_t c)
860 {
861 	__asm volatile (
862 	"	movl	%0,%%a0		;"
863 	"	movl	%1,%%a1		;"
864 	"	movl	%2,%%d0		;"
865 	"1:	movw	%%a1@+,%%d1	;"
866 	"	rolw	#8,%%d1		;"
867 	"	movw	%%d1,%%a0@	;"
868 	"	subql	#1,%%d0		;"
869 	"	jne	1b"					:
870 								:
871 		    "r" (h->base + offset), "g" (a), "g" (c)	:
872 		    "a0","a1","d0","d1");
873 }
874 
875 void
mac68k_bswm2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int16_t * a,size_t c)876 mac68k_bswm2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
877 		 const u_int16_t *a, size_t c)
878 {
879 	while (c--) {
880 		bus_space_write_2(t, *h, offset, *a++);
881 	}
882 }
883 
884 void
mac68k_bswms2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int16_t * a,size_t c)885 mac68k_bswms2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
886 		  const u_int16_t *a, size_t c)
887 {
888 	while (c--) {
889 		bus_space_write_stream_2(t, *h, offset, *a++);
890 	}
891 }
892 
893 void
mac68k_bswm4(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int32_t * a,size_t c)894 mac68k_bswm4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
895 	     const u_int32_t *a, size_t c)
896 {
897 	__asm volatile (
898 	"	movl	%0,%%a0		;"
899 	"	movl	%1,%%a1		;"
900 	"	movl	%2,%%d0		;"
901 	"1:	movl	%%a1@+,%%a0@	;"
902 	"	subql	#1,%%d0		;"
903 	"	jne	1b"					:
904 								:
905 		    "r" (h->base + offset), "g" (a), "g" (c)	:
906 		    "a0","a1","d0");
907 }
908 
909 void
mac68k_bswm4_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int32_t * a,size_t c)910 mac68k_bswm4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
911 		  const u_int32_t *a, size_t c)
912 {
913 	__asm volatile (
914 	"	movl	%0,%%a0		;"
915 	"	movl	%1,%%a1		;"
916 	"	movl	%2,%%d0		;"
917 	"1:	movl	%%a1@+,%%d1	;"
918 	"	rolw	#8,%%d1		;"
919 	"	swap	%%d1		;"
920 	"	rolw	#8,%%d1		;"
921 	"	movl	%%d1,%%a0@	;"
922 	"	subql	#1,%%d0		;"
923 	"	jne	1b"					:
924 								:
925 		    "r" (h->base + offset), "g" (a), "g" (c)	:
926 		    "a0","a1","d0","d1");
927 }
928 
929 void
mac68k_bswm4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int32_t * a,size_t c)930 mac68k_bswm4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
931 		 const u_int32_t *a, size_t c)
932 {
933 	while (c--) {
934 		bus_space_write_4(t, *h, offset, *a++);
935 	}
936 }
937 
938 void
mac68k_bswms4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int32_t * a,size_t c)939 mac68k_bswms4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
940 		  const u_int32_t *a, size_t c)
941 {
942 	while (c--) {
943 		bus_space_write_stream_4(t, *h, offset, *a++);
944 	}
945 }
946 
947 void
mac68k_bswr1(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int8_t * a,size_t c)948 mac68k_bswr1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
949 	     const u_int8_t *a, size_t c)
950 {
951 	__asm volatile (
952 	"	movl	%0,%%a0		;"
953 	"	movl	%1,%%a1		;"
954 	"	movl	%2,%%d0		;"
955 	"1:	movb	%%a1@+,%%a0@+	;"
956 	"	subql	#1,%%d0		;"
957 	"	jne	1b"					:
958 								:
959 		    "r" (h->base + offset), "g" (a), "g" (c)	:
960 		    "a0","a1","d0");
961 }
962 
963 void
mac68k_bswr1_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int8_t * a,size_t c)964 mac68k_bswr1_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
965 		 const u_int8_t *a, size_t c)
966 {
967 	while (c--) {
968 		bus_space_write_1(t, *h, offset, *a++);
969 		offset++;
970 	}
971 }
972 
973 void
mac68k_bswr2(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int16_t * a,size_t c)974 mac68k_bswr2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
975 	     const u_int16_t *a, size_t c)
976 {
977 	__asm volatile (
978 	"	movl	%0,%%a0		;"
979 	"	movl	%1,%%a1		;"
980 	"	movl	%2,%%d0		;"
981 	"1:	movw	%%a1@+,%%a0@+	;"
982 	"	subql	#1,%%d0		;"
983 	"	jne	1b"					:
984 								:
985 		    "r" (h->base + offset), "g" (a), "g" (c)	:
986 		    "a0","a1","d0");
987 }
988 
989 void
mac68k_bswr2_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int16_t * a,size_t c)990 mac68k_bswr2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
991 		  const u_int16_t *a, size_t c)
992 {
993 	__asm volatile (
994 	"	movl	%0,%%a0		;"
995 	"	movl	%1,%%a1		;"
996 	"	movl	%2,%%d0		;"
997 	"1:	movw	%%a1@+,%%d1	;"
998 	"	rolw	#8,%%d1		;"
999 	"	movw	%%d1,%%a0@+	;"
1000 	"	subql	#1,%%d0		;"
1001 	"	jne	1b"					:
1002 								:
1003 		    "r" (h->base + offset), "g" (a), "g" (c)	:
1004 		    "a0","a1","d0","d1");
1005 }
1006 
1007 void
mac68k_bswr2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int16_t * a,size_t c)1008 mac68k_bswr2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1009 		 const u_int16_t *a, size_t c)
1010 {
1011 	while (c--) {
1012 		bus_space_write_2(t, *h, offset, *a++);
1013 		offset += 2;
1014 	}
1015 }
1016 
1017 void
mac68k_bswrs2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int16_t * a,size_t c)1018 mac68k_bswrs2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1019 		  const u_int16_t *a, size_t c)
1020 {
1021 	while (c--) {
1022 		bus_space_write_stream_2(t, *h, offset, *a++);
1023 		offset += 2;
1024 	}
1025 }
1026 
1027 void
mac68k_bswr4(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int32_t * a,size_t c)1028 mac68k_bswr4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1029 	     const u_int32_t *a, size_t c)
1030 {
1031 	__asm volatile (
1032 	"	movl	%0,%%a0		;"
1033 	"	movl	%1,%%a1		;"
1034 	"	movl	%2,%%d0		;"
1035 	"1:	movl	%%a1@+,%%a0@+	;"
1036 	"	subql	#1,%%d0		;"
1037 	"	jne	1b"					:
1038 								:
1039 		    "r" (h->base + offset), "g" (a), "g" (c)	:
1040 		    "a0","a1","d0");
1041 }
1042 
1043 void
mac68k_bswr4_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int32_t * a,size_t c)1044 mac68k_bswr4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1045 		  const u_int32_t *a, size_t c)
1046 {
1047 	__asm volatile (
1048 	"	movl	%0,%%a0		;"
1049 	"	movl	%1,%%a1		;"
1050 	"	movl	%2,%%d0		;"
1051 	"1:	movl	%%a1@+,%%d1	;"
1052 	"	rolw	#8,%%d1		;"
1053 	"	swap	%%d1		;"
1054 	"	rolw	#8,%%d1		;"
1055 	"	movl	%%d1,%%a0@+	;"
1056 	"	subql	#1,%%d0		;"
1057 	"	jne	1b"					:
1058 								:
1059 		    "r" (h->base + offset), "g" (a), "g" (c)	:
1060 		    "a0","a1","d0","d1");
1061 }
1062 
1063 void
mac68k_bswr4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int32_t * a,size_t c)1064 mac68k_bswr4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1065 		 const u_int32_t *a, size_t c)
1066 {
1067 	while (c--) {
1068 		bus_space_write_4(t, *h, offset, *a++);
1069 		offset += 4;
1070 	}
1071 }
1072 
1073 void
mac68k_bswrs4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,const u_int32_t * a,size_t c)1074 mac68k_bswrs4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1075 		  const u_int32_t *a, size_t c)
1076 {
1077 	while (c--) {
1078 		bus_space_write_4(t, *h, offset, *a++);
1079 		offset += 4;
1080 	}
1081 }
1082 
1083 void
mac68k_bssm1(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int8_t v,size_t c)1084 mac68k_bssm1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1085 	     u_int8_t v, size_t c)
1086 {
1087 	__asm volatile (
1088 	"	movl	%0,%%a0		;"
1089 	"	movl	%1,%%d1		;"
1090 	"	movl	%2,%%d0		;"
1091 	"1:	movb	%%d1,%%a0@	;"
1092 	"	subql	#1,%%d0		;"
1093 	"	jne	1b"						:
1094 									:
1095 		    "r" (h->base + offset), "g" ((u_long)v), "g" (c)	:
1096 		    "a0","d0","d1");
1097 }
1098 
1099 void
mac68k_bssm1_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int8_t v,size_t c)1100 mac68k_bssm1_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1101 		 u_int8_t v, size_t c)
1102 {
1103 	while (c--) {
1104 		bus_space_write_1(t, *h, offset, v);
1105 	}
1106 }
1107 
1108 void
mac68k_bssm2(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t v,size_t c)1109 mac68k_bssm2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1110 	     u_int16_t v, size_t c)
1111 {
1112 	__asm volatile (
1113 	"	movl	%0,%%a0		;"
1114 	"	movl	%1,%%d1		;"
1115 	"	movl	%2,%%d0		;"
1116 	"1:	movw	%%d1,%%a0@	;"
1117 	"	subql	#1,%%d0		;"
1118 	"	jne	1b"						:
1119 									:
1120 		    "r" (h->base + offset), "g" ((u_long)v), "g" (c)	:
1121 		    "a0","d0","d1");
1122 }
1123 
1124 void
mac68k_bssm2_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t v,size_t c)1125 mac68k_bssm2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1126 		  u_int16_t v, size_t c)
1127 {
1128 	__asm volatile (
1129 	"	movl	%0,%%a0		;"
1130 	"	movl	%1,%%d1		;"
1131 	"	rolw	#8,%%d1		;"
1132 	"	movl	%2,%%d0		;"
1133 	"1:	movw	%%d1,%%a0@	;"
1134 	"	subql	#1,%%d0		;"
1135 	"	jne	1b"						:
1136 									:
1137 		    "r" (h->base + offset), "g" ((u_long)v), "g" (c)	:
1138 		    "a0","d0","d1");
1139 }
1140 
1141 void
mac68k_bssm2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t v,size_t c)1142 mac68k_bssm2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1143 		 u_int16_t v, size_t c)
1144 {
1145 	while (c--) {
1146 		bus_space_write_2(t, *h, offset, v);
1147 	}
1148 }
1149 
1150 void
mac68k_bssm4(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t v,size_t c)1151 mac68k_bssm4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1152 	     u_int32_t v, size_t c)
1153 {
1154 	__asm volatile (
1155 	"	movl	%0,%%a0		;"
1156 	"	movl	%1,%%d1		;"
1157 	"	movl	%2,%%d0		;"
1158 	"1:	movl	%%d1,%%a0@	;"
1159 	"	subql	#1,%%d0		;"
1160 	"	jne	1b"						:
1161 									:
1162 		    "r" (h->base + offset), "g" ((u_long)v), "g" (c)	:
1163 		    "a0","d0","d1");
1164 }
1165 
1166 void
mac68k_bssm4_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t v,size_t c)1167 mac68k_bssm4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1168 		  u_int32_t v, size_t c)
1169 {
1170 	__asm volatile (
1171 	"	movl	%0,%%a0		;"
1172 	"	movl	%1,%%d1		;"
1173 	"	rolw	#8,%%d1		;"
1174 	"	swap	%%d1		;"
1175 	"	rolw	#8,%%d1		;"
1176 	"	movl	%2,%%d0		;"
1177 	"1:	movl	%%d1,%%a0@	;"
1178 	"	subql	#1,%%d0		;"
1179 	"	jne	1b"						:
1180 									:
1181 		    "r" (h->base + offset), "g" ((u_long)v), "g" (c)	:
1182 		    "a0","d0","d1");
1183 }
1184 
1185 void
mac68k_bssm4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t v,size_t c)1186 mac68k_bssm4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1187 		 u_int32_t v, size_t c)
1188 {
1189 	while (c--) {
1190 		bus_space_write_4(t, *h, offset, v);
1191 	}
1192 }
1193 
1194 void
mac68k_bssr1(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int8_t v,size_t c)1195 mac68k_bssr1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1196 	     u_int8_t v, size_t c)
1197 {
1198 	__asm volatile (
1199 	"	movl	%0,%%a0		;"
1200 	"	movl	%1,%%d1		;"
1201 	"	movl	%2,%%d0		;"
1202 	"1:	movb	%%d1,%%a0@+	;"
1203 	"	subql	#1,%%d0		;"
1204 	"	jne	1b"						:
1205 									:
1206 		    "r" (h->base + offset), "g" ((u_long)v), "g" (c)	:
1207 		    "a0","d0","d1");
1208 }
1209 
1210 void
mac68k_bssr1_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int8_t v,size_t c)1211 mac68k_bssr1_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1212 		 u_int8_t v, size_t c)
1213 {
1214 	while (c--) {
1215 		bus_space_write_1(t, *h, offset, v);
1216 		offset++;
1217 	}
1218 }
1219 
1220 void
mac68k_bssr2(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t v,size_t c)1221 mac68k_bssr2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1222 	     u_int16_t v, size_t c)
1223 {
1224 	__asm volatile (
1225 	"	movl	%0,%%a0		;"
1226 	"	movl	%1,%%d1		;"
1227 	"	movl	%2,%%d0		;"
1228 	"1:	movw	%%d1,%%a0@+	;"
1229 	"	subql	#1,%%d0		;"
1230 	"	jne	1b"						:
1231 									:
1232 		    "r" (h->base + offset), "g" ((u_long)v), "g" (c)	:
1233 		    "a0","d0","d1");
1234 }
1235 
1236 void
mac68k_bssr2_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t v,size_t c)1237 mac68k_bssr2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1238 		  u_int16_t v, size_t c)
1239 {
1240 	__asm volatile (
1241 	"	movl	%0,%%a0		;"
1242 	"	movl	%1,%%d1		;"
1243 	"	rolw	#8,%%d1		;"
1244 	"	movl	%2,%%d0		;"
1245 	"1:	movw	%%d1,%%a0@+	;"
1246 	"	subql	#1,%%d0		;"
1247 	"	jne	1b"						:
1248 									:
1249 		    "r" (h->base + offset), "g" ((u_long)v), "g" (c)	:
1250 		    "a0","d0","d1");
1251 }
1252 
1253 void
mac68k_bssr2_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int16_t v,size_t c)1254 mac68k_bssr2_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1255 		 u_int16_t v, size_t c)
1256 {
1257 	while (c--) {
1258 		bus_space_write_2(t, *h, offset, v);
1259 		offset += 2;
1260 	}
1261 }
1262 
1263 void
mac68k_bssr4(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t v,size_t c)1264 mac68k_bssr4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1265 	     u_int32_t v, size_t c)
1266 {
1267 	__asm volatile (
1268 	"	movl	%0,%%a0		;"
1269 	"	movl	%1,%%d1		;"
1270 	"	movl	%2,%%d0		;"
1271 	"1:	movl	%%d1,%%a0@+	;"
1272 	"	subql	#1,%%d0		;"
1273 	"	jne	1b"						:
1274 									:
1275 		    "r" (h->base + offset), "g" ((u_long)v), "g" (c)	:
1276 		    "a0","d0","d1");
1277 }
1278 
1279 void
mac68k_bssr4_swap(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t v,size_t c)1280 mac68k_bssr4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1281 		  u_int32_t v, size_t c)
1282 {
1283 	__asm volatile (
1284 	"	movl	%0,%%a0		;"
1285 	"	movl	%1,%%d1		;"
1286 	"	rolw	#8,%%d1		;"
1287 	"	swap	%%d1		;"
1288 	"	rolw	#8,%%d1		;"
1289 	"	movl	%2,%%d0		;"
1290 	"1:	movl	%%d1,%%a0@+	;"
1291 	"	subql	#1,%%d0		;"
1292 	"	jne	1b"						:
1293 									:
1294 		    "r" (h->base + offset), "g" ((u_long)v), "g" (c)	:
1295 		    "a0","d0","d1");
1296 }
1297 
1298 void
mac68k_bssr4_gen(bus_space_tag_t t,bus_space_handle_t * h,bus_size_t offset,u_int32_t v,size_t c)1299 mac68k_bssr4_gen(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
1300 		 u_int32_t v, size_t c)
1301 {
1302 	while (c--) {
1303 		bus_space_write_4(t, *h, offset, v);
1304 		offset += 4;
1305 	}
1306 }
1307