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