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