Annotation of sys/arch/mac68k/mac68k/bus_space.c, Revision 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