Annotation of sys/arch/mac68k/mac68k/bus_space.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: bus_space.c,v 1.22 2006/06/24 13:24:21 miod Exp $ */
2: /* $NetBSD: bus_space.c,v 1.5 1999/03/26 23:41:30 mycroft Exp $ */
3:
4: /*-
5: * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to The NetBSD Foundation
9: * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
10: * NASA Ames Research Center.
11: *
12: * Redistribution and use in source and binary forms, with or without
13: * modification, are permitted provided that the following conditions
14: * are met:
15: * 1. Redistributions of source code must retain the above copyright
16: * notice, this list of conditions and the following disclaimer.
17: * 2. Redistributions in binary form must reproduce the above copyright
18: * notice, this list of conditions and the following disclaimer in the
19: * documentation and/or other materials provided with the distribution.
20: * 3. All advertising materials mentioning features or use of this software
21: * must display the following acknowledgement:
22: * This product includes software developed by the NetBSD
23: * Foundation, Inc. and its contributors.
24: * 4. Neither the name of The NetBSD Foundation nor the names of its
25: * contributors may be used to endorse or promote products derived
26: * from this software without specific prior written permission.
27: *
28: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
29: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
30: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
32: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38: * POSSIBILITY OF SUCH DAMAGE.
39: */
40:
41: /*
42: * Implementation of bus_space mapping for mac68k.
43: */
44:
45: #include <sys/param.h>
46: #include <sys/systm.h>
47: #include <sys/extent.h>
48:
49: #include <machine/bus.h>
50:
51: #include <uvm/uvm_extern.h>
52:
53: int bus_mem_add_mapping(bus_addr_t, bus_size_t,
54: int, bus_space_handle_t *);
55:
56: extern struct extent *iomem_ex;
57: extern int iomem_malloc_safe;
58: label_t *nofault;
59:
60: int
61: bus_space_map(t, bpa, size, flags, bshp)
62: bus_space_tag_t t;
63: bus_addr_t bpa;
64: bus_size_t size;
65: int flags;
66: bus_space_handle_t *bshp;
67: {
68: paddr_t pa, endpa;
69: int error;
70:
71: /*
72: * Before we go any further, let's make sure that this
73: * region is available.
74: */
75: error = extent_alloc_region(iomem_ex, bpa, size,
76: EX_NOWAIT | (iomem_malloc_safe ? EX_MALLOCOK : 0));
77: if (error)
78: return (error);
79:
80: pa = trunc_page(bpa + t);
81: endpa = round_page((bpa + t + size) - 1);
82:
83: #ifdef DIAGNOSTIC
84: if (endpa <= pa)
85: panic("bus_space_map: overflow");
86: #endif
87:
88: error = bus_mem_add_mapping(bpa, size, flags, bshp);
89: if (error) {
90: if (extent_free(iomem_ex, bpa, size, EX_NOWAIT |
91: (iomem_malloc_safe ? EX_MALLOCOK : 0))) {
92: printf("bus_space_map: pa 0x%lx, size 0x%lx\n",
93: bpa, size);
94: printf("bus_space_map: can't free region\n");
95: }
96: }
97:
98: return (error);
99: }
100:
101: int
102: bus_space_alloc(t, rstart, rend, size, alignment, boundary, flags, bpap, bshp)
103: bus_space_tag_t t;
104: bus_addr_t rstart, rend;
105: bus_size_t size, alignment, boundary;
106: int flags;
107: bus_addr_t *bpap;
108: bus_space_handle_t *bshp;
109: {
110: u_long bpa;
111: int error;
112:
113: /*
114: * Sanity check the allocation against the extent's boundaries.
115: */
116: if (rstart < iomem_ex->ex_start || rend > iomem_ex->ex_end)
117: panic("bus_space_alloc: bad region start/end");
118:
119: /*
120: * Do the requested allocation.
121: */
122: error = extent_alloc_subregion(iomem_ex, rstart, rend, size, alignment,
123: 0, boundary,
124: EX_FAST | EX_NOWAIT | (iomem_malloc_safe ? EX_MALLOCOK : 0),
125: &bpa);
126:
127: if (error)
128: return (error);
129:
130: /*
131: * For memory space, map the bus physical address to
132: * a kernel virtual address.
133: */
134: error = bus_mem_add_mapping(bpa, size, flags, bshp);
135: if (error) {
136: if (extent_free(iomem_ex, bpa, size, EX_NOWAIT |
137: (iomem_malloc_safe ? EX_MALLOCOK : 0))) {
138: printf("bus_space_alloc: pa 0x%lx, size 0x%lx\n",
139: bpa, size);
140: printf("bus_space_alloc: can't free region\n");
141: }
142: }
143:
144: *bpap = bpa;
145:
146: return (error);
147: }
148:
149: int
150: bus_mem_add_mapping(bpa, size, flags, bshp)
151: bus_addr_t bpa;
152: bus_size_t size;
153: int flags;
154: bus_space_handle_t *bshp;
155: {
156: u_long pa, endpa;
157: vaddr_t va;
158: pt_entry_t pte;
159:
160: pa = trunc_page(bpa);
161: endpa = round_page((bpa + size) - 1);
162:
163: #ifdef DIAGNOSTIC
164: if (endpa <= pa)
165: panic("bus_mem_add_mapping: overflow");
166: #endif
167:
168: va = uvm_km_valloc(kernel_map, endpa - pa);
169: if (va == 0)
170: return (ENOMEM);
171:
172: bshp->base = (u_long)(va + m68k_page_offset(bpa));
173: bshp->swapped = 0;
174: bshp->bsr1 = mac68k_bsr1;
175: bshp->bsr2 = mac68k_bsr2;
176: bshp->bsr4 = mac68k_bsr4;
177: bshp->bsrm1 = mac68k_bsrm1;
178: bshp->bsrm2 = mac68k_bsrm2;
179: bshp->bsrm4 = mac68k_bsrm4;
180: bshp->bsrr1 = mac68k_bsrr1;
181: bshp->bsrr2 = mac68k_bsrr2;
182: bshp->bsrr4 = mac68k_bsrr4;
183: bshp->bsw1 = mac68k_bsw1;
184: bshp->bsw2 = mac68k_bsw2;
185: bshp->bsw4 = mac68k_bsw4;
186: bshp->bswm1 = mac68k_bswm1;
187: bshp->bswm2 = mac68k_bswm2;
188: bshp->bswm4 = mac68k_bswm4;
189: bshp->bswr1 = mac68k_bswr1;
190: bshp->bswr2 = mac68k_bswr2;
191: bshp->bswr4 = mac68k_bswr4;
192: bshp->bssm1 = mac68k_bssm1;
193: bshp->bssm2 = mac68k_bssm2;
194: bshp->bssm4 = mac68k_bssm4;
195: bshp->bssr1 = mac68k_bssr1;
196: bshp->bssr2 = mac68k_bssr2;
197: bshp->bssr4 = mac68k_bssr4;
198:
199: if (flags & BUS_SPACE_MAP_CACHEABLE)
200: pte = PG_CWT;
201: else
202: pte = PG_CI;
203:
204: for (; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE)
205: pmap_enter_cache(pmap_kernel(), va, pa,
206: UVM_PROT_RW, UVM_PROT_RW | PMAP_WIRED, pte);
207: pmap_update(pmap_kernel());
208:
209: return 0;
210: }
211:
212: void
213: bus_space_unmap(t, bsh, size)
214: bus_space_tag_t t;
215: bus_space_handle_t bsh;
216: bus_size_t size;
217: {
218: vaddr_t va, endva;
219: bus_addr_t bpa;
220:
221: va = trunc_page(bsh.base);
222: endva = round_page((bsh.base + size) - 1);
223:
224: #ifdef DIAGNOSTIC
225: if (endva <= va)
226: panic("bus_space_unmap: overflow");
227: #endif
228:
229: pmap_extract(pmap_kernel(), va, &bpa);
230: bpa += m68k_page_offset(bsh.base);
231:
232: /*
233: * Free the kernel virtual mapping.
234: */
235: pmap_remove(pmap_kernel(), va, endva);
236: pmap_update(pmap_kernel());
237: uvm_km_free(kernel_map, va, endva - va);
238:
239: if (extent_free(iomem_ex, bpa, size,
240: EX_NOWAIT | (iomem_malloc_safe ? EX_MALLOCOK : 0))) {
241: printf("bus_space_unmap: pa 0x%lx, size 0x%lx\n",
242: bpa, size);
243: printf("bus_space_unmap: can't free region\n");
244: }
245: }
246:
247: void
248: bus_space_free(t, bsh, size)
249: bus_space_tag_t t;
250: bus_space_handle_t bsh;
251: bus_size_t size;
252: {
253: /* bus_space_unmap() does all that we need to do. */
254: bus_space_unmap(t, bsh, size);
255: }
256:
257: int
258: bus_space_subregion(t, bsh, offset, size, nbshp)
259: bus_space_tag_t t;
260: bus_space_handle_t bsh;
261: bus_size_t offset, size;
262: bus_space_handle_t *nbshp;
263: {
264: *nbshp = bsh;
265: nbshp->base += offset;
266: return (0);
267: }
268:
269: int
270: mac68k_bus_space_probe(t, bsh, offset, sz)
271: bus_space_tag_t t;
272: bus_space_handle_t bsh;
273: bus_size_t offset;
274: int sz;
275: {
276: int i;
277: label_t faultbuf;
278:
279: nofault = &faultbuf;
280: if (setjmp(nofault)) {
281: nofault = (label_t *)0;
282: return (0);
283: }
284:
285: switch (sz) {
286: case 1:
287: i = bus_space_read_1(t, bsh, offset);
288: break;
289: case 2:
290: i = bus_space_read_2(t, bsh, offset);
291: break;
292: case 4:
293: i = bus_space_read_4(t, bsh, offset);
294: break;
295: case 8:
296: default:
297: panic("bus_space_probe: unsupported data size %d", sz);
298: /* NOTREACHED */
299: }
300:
301: nofault = (label_t *)0;
302: return (1);
303: }
304:
305: void
306: mac68k_bus_space_handle_swapped(t, h)
307: bus_space_tag_t t;
308: bus_space_handle_t *h;
309: {
310: h->swapped = 1;
311: h->bsr2 = mac68k_bsr2_swap;
312: h->bsr4 = mac68k_bsr4_swap;
313: h->bsrm2 = mac68k_bsrm2_swap;
314: h->bsrm4 = mac68k_bsrm4_swap;
315: h->bsrr2 = mac68k_bsrr2_swap;
316: h->bsrr4 = mac68k_bsrr4_swap;
317: h->bsw2 = mac68k_bsw2_swap;
318: h->bsw4 = mac68k_bsw4_swap;
319: h->bswm2 = mac68k_bswm2_swap;
320: h->bswm4 = mac68k_bswm4_swap;
321: h->bswr2 = mac68k_bswr2_swap;
322: h->bswr4 = mac68k_bswr4_swap;
323: h->bssm2 = mac68k_bssm2_swap;
324: h->bssm4 = mac68k_bssm4_swap;
325: h->bssr2 = mac68k_bssr2_swap;
326: h->bssr4 = mac68k_bssr4_swap;
327: }
328:
329: u_int8_t
330: mac68k_bsr1(bus_space_tag_t t, bus_space_handle_t *bsh, bus_size_t offset)
331: {
332: return (*(volatile u_int8_t *) (bsh->base + offset));
333: }
334:
335: u_int16_t
336: mac68k_bsr2(bus_space_tag_t t, bus_space_handle_t *bsh, bus_size_t offset)
337: {
338: return (*(volatile u_int16_t *) (bsh->base + offset));
339: }
340:
341: u_int16_t
342: mac68k_bsr2_swap(bus_space_tag_t t, bus_space_handle_t *bsh, bus_size_t offset)
343: {
344: u_int16_t v;
345:
346: v = (*(volatile u_int16_t *) (bsh->base + offset));
347: return swap16(v);
348: }
349:
350: u_int32_t
351: mac68k_bsr4(bus_space_tag_t tag, bus_space_handle_t *bsh, bus_size_t offset)
352: {
353: return (*(volatile u_int32_t *) (bsh->base + offset));
354: }
355:
356: u_int32_t
357: mac68k_bsr4_swap(bus_space_tag_t t, bus_space_handle_t *bsh, bus_size_t offset)
358: {
359: u_int32_t v;
360:
361: v = (*(volatile u_int32_t *) (bsh->base + offset));
362: return swap32(v);
363: }
364:
365: void
366: mac68k_bsrm1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
367: u_int8_t *a, size_t c)
368: {
369: __asm __volatile (
370: " movl %0,a0 ;"
371: " movl %1,a1 ;"
372: " movl %2,d0 ;"
373: "1: movb a0@,a1@+ ;"
374: " subql #1,d0 ;"
375: " jne 1b" :
376: :
377: "r" (h->base + offset), "g" (a), "g" (c) :
378: "a0","a1","d0");
379: }
380:
381: void
382: mac68k_bsrm2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
383: u_int16_t *a, size_t c)
384: {
385: __asm __volatile (
386: " movl %0,a0 ;"
387: " movl %1,a1 ;"
388: " movl %2,d0 ;"
389: "1: movw a0@,a1@+ ;"
390: " subql #1,d0 ;"
391: " jne 1b" :
392: :
393: "r" (h->base + offset), "g" (a), "g" (c) :
394: "a0","a1","d0");
395: }
396:
397: void
398: mac68k_bsrm2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
399: u_int16_t *a, size_t c)
400: {
401: __asm __volatile (
402: " movl %0,a0 ;"
403: " movl %1,a1 ;"
404: " movl %2,d0 ;"
405: "1: movw a0@,d1 ;"
406: " rolw #8,d1 ;"
407: " movw d1,a1@+ ;"
408: " subql #1,d0 ;"
409: " jne 1b" :
410: :
411: "r" (h->base + offset), "g" (a), "g" (c) :
412: "a0","a1","d0","d1");
413: }
414:
415: void
416: mac68k_bsrm4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
417: u_int32_t *a, size_t c)
418: {
419: __asm __volatile (
420: " movl %0,a0 ;"
421: " movl %1,a1 ;"
422: " movl %2,%d0 ;"
423: "1: movl a0@,a1@+ ;"
424: " subql #1,d0 ;"
425: " jne 1b" :
426: :
427: "r" (h->base + offset), "g" (a), "g" (c) :
428: "a0","a1","d0");
429: }
430:
431: void
432: mac68k_bsrm4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
433: u_int32_t *a, size_t c)
434: {
435: __asm __volatile (
436: " movl %0,a0 ;"
437: " movl %1,a1 ;"
438: " movl %2,d0 ;"
439: "1: movl a0@,d1 ;"
440: " rolw #8,d1 ;"
441: " swap d1 ;"
442: " rolw #8,d1 ;"
443: " movl d1,a1@+ ;"
444: " subql #1,d0 ;"
445: " jne 1b" :
446: :
447: "r" (h->base + offset), "g" (a), "g" (c) :
448: "a0","a1","d0","d1");
449: }
450:
451: void
452: mac68k_bsrr1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
453: u_int8_t *a, size_t c)
454: {
455: __asm __volatile (
456: " movl %0,a0 ;"
457: " movl %1,a1 ;"
458: " movl %2,d0 ;"
459: "1: movb a0@+,a1@+ ;"
460: " subql #1,d0 ;"
461: " jne 1b" :
462: :
463: "r" (h->base + offset), "g" (a), "g" (c) :
464: "a0","a1","d0");
465: }
466:
467: void
468: mac68k_bsrr2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
469: u_int16_t *a, size_t c)
470: {
471: __asm __volatile (
472: " movl %0,a0 ;"
473: " movl %1,a1 ;"
474: " movl %2,d0 ;"
475: "1: movw a0@+,a1@+ ;"
476: " subql #1,d0 ;"
477: " jne 1b" :
478: :
479: "r" (h->base + offset), "g" (a), "g" (c) :
480: "a0","a1","d0");
481: }
482:
483: void
484: mac68k_bsrr2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
485: u_int16_t *a, size_t c)
486: {
487: __asm __volatile (
488: " movl %0,a0 ;"
489: " movl %1,a1 ;"
490: " movl %2,d0 ;"
491: "1: movw a0@+,d1 ;"
492: " rolw #8,d1 ;"
493: " movw d1,a1@+ ;"
494: " subql #1,d0 ;"
495: " jne 1b" :
496: :
497: "r" (h->base + offset), "g" (a), "g" (c) :
498: "a0","a1","d0","d1");
499: }
500:
501: void
502: mac68k_bsrr4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
503: u_int32_t *a, size_t c)
504: {
505: __asm __volatile (
506: " movl %0,a0 ;"
507: " movl %1,a1 ;"
508: " movl %2,d0 ;"
509: "1: movl a0@+,a1@+ ;"
510: " subql #1,d0 ;"
511: " jne 1b" :
512: :
513: "r" (h->base + offset), "g" (a), "g" (c) :
514: "a0","a1","d0");
515: }
516:
517: void
518: mac68k_bsrr4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
519: u_int32_t *a, size_t c)
520: {
521: __asm __volatile (
522: " movl %0,a0 ;"
523: " movl %1,a1 ;"
524: " movl %2,d0 ;"
525: "1: movl a0@+,d1 ;"
526: " rolw #8,d1 ;"
527: " swap d1 ;"
528: " rolw #8,d1 ;"
529: " movl d1,a1@+ ;"
530: " subql #1,d0 ;"
531: " jne 1b" :
532: :
533: "r" (h->base + offset), "g" (a), "g" (c) :
534: "a0","a1","d0");
535: }
536:
537: void
538: mac68k_bsw1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
539: u_int8_t v)
540: {
541: (*(volatile u_int8_t *)(h->base + offset)) = v;
542: }
543:
544: void
545: mac68k_bsw2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
546: u_int16_t v)
547: {
548: (*(volatile u_int16_t *)(h->base + offset)) = v;
549: }
550:
551: void
552: mac68k_bsw2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
553: u_int16_t v)
554: {
555: v = swap16(v);
556: (*(volatile u_int16_t *)(h->base + offset)) = v;
557: }
558:
559: void
560: mac68k_bsw4(bus_space_tag_t tag, bus_space_handle_t *h, bus_size_t offset,
561: u_int32_t v)
562: {
563: (*(volatile u_int32_t *)(h->base + offset)) = v;
564: }
565:
566: void
567: mac68k_bsw4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
568: u_int32_t v)
569: {
570: v = swap32(v);
571: (*(volatile u_int32_t *)(h->base + offset)) = v;
572: }
573:
574: void
575: mac68k_bswm1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
576: const u_int8_t *a, size_t c)
577: {
578: __asm __volatile (
579: " movl %0,a0 ;"
580: " movl %1,a1 ;"
581: " movl %2,d0 ;"
582: "1: movb a1@+,a0@ ;"
583: " subql #1,d0 ;"
584: " jne 1b" :
585: :
586: "r" (h->base + offset), "g" (a), "g" (c) :
587: "a0","a1","d0");
588: }
589:
590: void
591: mac68k_bswm2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
592: const u_int16_t *a, size_t c)
593: {
594: __asm __volatile (
595: " movl %0,a0 ;"
596: " movl %1,a1 ;"
597: " movl %2,d0 ;"
598: "1: movw a1@+,a0@ ;"
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
607: mac68k_bswm2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
608: const u_int16_t *a, size_t c)
609: {
610: __asm __volatile (
611: " movl %0,a0 ;"
612: " movl %1,a1 ;"
613: " movl %2,d0 ;"
614: "1: movw a1@+,d1 ;"
615: " rolw #8,d1 ;"
616: " movw d1,a0@ ;"
617: " subql #1,d0 ;"
618: " jne 1b" :
619: :
620: "r" (h->base + offset), "g" (a), "g" (c) :
621: "a0","a1","d0","d1");
622: }
623:
624: void
625: mac68k_bswm4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
626: const u_int32_t *a, size_t c)
627: {
628: __asm __volatile (
629: " movl %0,a0 ;"
630: " movl %1,a1 ;"
631: " movl %2,d0 ;"
632: "1: movl a1@+,a0@ ;"
633: " subql #1,d0 ;"
634: " jne 1b" :
635: :
636: "r" (h->base + offset), "g" (a), "g" (c) :
637: "a0","a1","d0");
638: }
639:
640: void
641: mac68k_bswm4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
642: const u_int32_t *a, size_t c)
643: {
644: __asm __volatile (
645: " movl %0,a0 ;"
646: " movl %1,a1 ;"
647: " movl %2,d0 ;"
648: "1: movl a1@+,d1 ;"
649: " rolw #8,d1 ;"
650: " swap d1 ;"
651: " rolw #8,d1 ;"
652: " movl d1,a0@ ;"
653: " subql #1,d0 ;"
654: " jne 1b" :
655: :
656: "r" (h->base + offset), "g" (a), "g" (c) :
657: "a0","a1","d0","d1");
658: }
659:
660: void
661: mac68k_bswr1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
662: const u_int8_t *a, size_t c)
663: {
664: __asm __volatile (
665: " movl %0,a0 ;"
666: " movl %1,a1 ;"
667: " movl %2,d0 ;"
668: "1: movb a1@+,a0@+ ;"
669: " subql #1,d0 ;"
670: " jne 1b" :
671: :
672: "r" (h->base + offset), "g" (a), "g" (c) :
673: "a0","a1","d0");
674: }
675:
676: void
677: mac68k_bswr2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
678: const u_int16_t *a, size_t c)
679: {
680: __asm __volatile (
681: " movl %0,a0 ;"
682: " movl %1,a1 ;"
683: " movl %2,d0 ;"
684: "1: movw a1@+,a0@+ ;"
685: " subql #1,d0 ;"
686: " jne 1b" :
687: :
688: "r" (h->base + offset), "g" (a), "g" (c) :
689: "a0","a1","d0");
690: }
691:
692: void
693: mac68k_bswr2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
694: const u_int16_t *a, size_t c)
695: {
696: __asm __volatile (
697: " movl %0,a0 ;"
698: " movl %1,a1 ;"
699: " movl %2,d0 ;"
700: "1: movw a1@+,d1 ;"
701: " rolw #8,d1 ;"
702: " movw d1,a0@+ ;"
703: " subql #1,d0 ;"
704: " jne 1b" :
705: :
706: "r" (h->base + offset), "g" (a), "g" (c) :
707: "a0","a1","d0","d1");
708: }
709:
710: void
711: mac68k_bswr4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
712: const u_int32_t *a, size_t c)
713: {
714: __asm __volatile (
715: " movl %0,a0 ;"
716: " movl %1,a1 ;"
717: " movl %2,d0 ;"
718: "1: movl a1@+,a0@+ ;"
719: " subql #1,d0 ;"
720: " jne 1b" :
721: :
722: "r" (h->base + offset), "g" (a), "g" (c) :
723: "a0","a1","d0");
724: }
725:
726: void
727: mac68k_bswr4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
728: const u_int32_t *a, size_t c)
729: {
730: __asm __volatile (
731: " movl %0,a0 ;"
732: " movl %1,a1 ;"
733: " movl %2,d0 ;"
734: "1: movl a1@+,d1 ;"
735: " rolw #8,d1 ;"
736: " swap d1 ;"
737: " rolw #8,d1 ;"
738: " movl d1,a0@+ ;"
739: " subql #1,d0 ;"
740: " jne 1b" :
741: :
742: "r" (h->base + offset), "g" (a), "g" (c) :
743: "a0","a1","d0","d1");
744: }
745:
746: void
747: mac68k_bssm1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
748: u_int8_t v, size_t c)
749: {
750: __asm __volatile (
751: " movl %0,a0 ;"
752: " movl %1,d1 ;"
753: " movl %2,d0 ;"
754: "1: movb d1,a0@ ;"
755: " subql #1,d0 ;"
756: " jne 1b" :
757: :
758: "r" (h->base + offset), "g" ((u_long)v), "g" (c) :
759: "a0","d0","d1");
760: }
761:
762: void
763: mac68k_bssm2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
764: u_int16_t v, size_t c)
765: {
766: __asm __volatile (
767: " movl %0,a0 ;"
768: " movl %1,d1 ;"
769: " movl %2,d0 ;"
770: "1: movw d1,a0@ ;"
771: " subql #1,d0 ;"
772: " jne 1b" :
773: :
774: "r" (h->base + offset), "g" ((u_long)v), "g" (c) :
775: "a0","d0","d1");
776: }
777:
778: void
779: mac68k_bssm2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
780: u_int16_t v, size_t c)
781: {
782: __asm __volatile (
783: " movl %0,a0 ;"
784: " movl %1,d1 ;"
785: " rolw #8,d1 ;"
786: " movl %2,d0 ;"
787: "1: movw d1,a0@ ;"
788: " subql #1,d0 ;"
789: " jne 1b" :
790: :
791: "r" (h->base + offset), "g" ((u_long)v), "g" (c) :
792: "a0","d0","d1");
793: }
794:
795: void
796: mac68k_bssm4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
797: u_int32_t v, size_t c)
798: {
799: __asm __volatile (
800: " movl %0,a0 ;"
801: " movl %1,d1 ;"
802: " movl %2,d0 ;"
803: "1: movl d1,a0@ ;"
804: " subql #1,d0 ;"
805: " jne 1b" :
806: :
807: "r" (h->base + offset), "g" ((u_long)v), "g" (c) :
808: "a0","d0","d1");
809: }
810:
811: void
812: mac68k_bssm4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
813: u_int32_t v, size_t c)
814: {
815: __asm __volatile (
816: " movl %0,a0 ;"
817: " movl %1,d1 ;"
818: " rolw #8,d1 ;"
819: " swap d1 ;"
820: " rolw #8,d1 ;"
821: " movl %2,d0 ;"
822: "1: movl d1,a0@ ;"
823: " subql #1,d0 ;"
824: " jne 1b" :
825: :
826: "r" (h->base + offset), "g" ((u_long)v), "g" (c) :
827: "a0","d0","d1");
828: }
829:
830: void
831: mac68k_bssr1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
832: u_int8_t v, size_t c)
833: {
834: __asm __volatile (
835: " movl %0,a0 ;"
836: " movl %1,d1 ;"
837: " movl %2,d0 ;"
838: "1: movb d1,a0@+ ;"
839: " subql #1,d0 ;"
840: " jne 1b" :
841: :
842: "r" (h->base + offset), "g" ((u_long)v), "g" (c) :
843: "a0","d0","d1");
844: }
845:
846: void
847: mac68k_bssr2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
848: u_int16_t v, size_t c)
849: {
850: __asm __volatile (
851: " movl %0,a0 ;"
852: " movl %1,d1 ;"
853: " movl %2,d0 ;"
854: "1: movw d1,a0@+ ;"
855: " subql #1,d0 ;"
856: " jne 1b" :
857: :
858: "r" (h->base + offset), "g" ((u_long)v), "g" (c) :
859: "a0","d0","d1");
860: }
861:
862: void
863: mac68k_bssr2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
864: u_int16_t v, size_t c)
865: {
866: __asm __volatile (
867: " movl %0,a0 ;"
868: " movl %1,d1 ;"
869: " rolw #8,d1 ;"
870: " movl %2,d0 ;"
871: "1: movw d1,a0@+ ;"
872: " subql #1,d0 ;"
873: " jne 1b" :
874: :
875: "r" (h->base + offset), "g" ((u_long)v), "g" (c) :
876: "a0","d0","d1");
877: }
878:
879: void
880: mac68k_bssr4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
881: u_int32_t v, size_t c)
882: {
883: __asm __volatile (
884: " movl %0,a0 ;"
885: " movl %1,d1 ;"
886: " movl %2,d0 ;"
887: "1: movl d1,a0@+ ;"
888: " subql #1,d0 ;"
889: " jne 1b" :
890: :
891: "r" (h->base + offset), "g" ((u_long)v), "g" (c) :
892: "a0","d0","d1");
893: }
894:
895: void
896: mac68k_bssr4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
897: u_int32_t v, size_t c)
898: {
899: __asm __volatile (
900: " movl %0,a0 ;"
901: " movl %1,d1 ;"
902: " rolw #8,d1 ;"
903: " swap d1 ;"
904: " rolw #8,d1 ;"
905: " movl %2,d0 ;"
906: "1: movl d1,a0@+ ;"
907: " subql #1,d0 ;"
908: " jne 1b" :
909: :
910: "r" (h->base + offset), "g" ((u_long)v), "g" (c) :
911: "a0","d0","d1");
912: }
CVSweb