Annotation of sys/arch/aviion/include/bus.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: bus.h,v 1.1.1.1 2006/05/09 18:18:49 miod Exp $ */
! 2: /*
! 3: * Copyright (c) 2004, Miodrag Vallat.
! 4: *
! 5: * Redistribution and use in source and binary forms, with or without
! 6: * modification, are permitted provided that the following conditions
! 7: * are met:
! 8: * 1. Redistributions of source code must retain the above copyright
! 9: * notice, this list of conditions and the following disclaimer.
! 10: * 2. Redistributions in binary form must reproduce the above copyright
! 11: * notice, this list of conditions and the following disclaimer in the
! 12: * documentation and/or other materials provided with the distribution.
! 13: *
! 14: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 15: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
! 16: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
! 17: * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
! 18: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! 19: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
! 20: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 21: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
! 22: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
! 23: * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 24: * POSSIBILITY OF SUCH DAMAGE.
! 25: */
! 26:
! 27: /*
! 28: * Simple aviion bus_space implementation.
! 29: *
! 30: * Currently, we only need specific handling for 32 bit read/writes in D16
! 31: * space, and this choice is made at compile time. As a result, all the
! 32: * implementation can go through macros or inline functions, except for
! 33: * the management functions.
! 34: */
! 35:
! 36: #ifndef _AVIION_BUS_H_
! 37: #define _AVIION_BUS_H_
! 38:
! 39: #include <machine/asm_macro.h>
! 40:
! 41: typedef u_int32_t bus_addr_t;
! 42: typedef u_int32_t bus_size_t;
! 43:
! 44: typedef u_int32_t bus_space_handle_t;
! 45:
! 46: struct aviion_bus_space_tag {
! 47: int (*bs_map)(bus_addr_t, bus_size_t, int, bus_space_handle_t *);
! 48: void (*bs_unmap)(bus_space_handle_t, bus_size_t);
! 49: int (*bs_subregion)(bus_space_handle_t, bus_size_t, bus_size_t,
! 50: bus_space_handle_t *);
! 51: void * (*bs_vaddr)(bus_space_handle_t);
! 52: /* alloc, free not implemented yet */
! 53: };
! 54:
! 55: typedef const struct aviion_bus_space_tag *bus_space_tag_t;
! 56:
! 57: #define BUS_SPACE_BARRIER_READ 0
! 58: #define BUS_SPACE_BARRIER_WRITE 1
! 59:
! 60: #define BUS_SPACE_MAP_CACHEABLE 0x01
! 61: #define BUS_SPACE_MAP_LINEAR 0x02
! 62:
! 63: /*
! 64: * General bus_space function set
! 65: */
! 66:
! 67: #define bus_space_map(t,a,s,f,r) ((t)->bs_map(a,s,f,r))
! 68: #define bus_space_unmap(t,h,s) ((t)->bs_unmap(h,s))
! 69: #define bus_space_subregion(t,h,o,s,r) ((t)->bs_subregion(h,o,s,r))
! 70: #define bus_space_vaddr(t,h) ((t)->bs_vaddr(h))
! 71:
! 72: static void bus_space_barrier(bus_space_tag_t, bus_space_handle_t,
! 73: bus_addr_t, bus_size_t, int);
! 74:
! 75: static __inline__ void
! 76: bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t handle,
! 77: bus_addr_t offset, bus_size_t size, int flags)
! 78: {
! 79: flush_pipeline(); /* overkill? */
! 80: }
! 81:
! 82: /*
! 83: * Read/Write/Region functions for D8 and D16 access.
! 84: * Most of these are straightforward and assume that everything is properly
! 85: * aligned.
! 86: */
! 87:
! 88: #define bus_space_read_1(tag, handle, offset) \
! 89: ((void)(tag), *(volatile u_int8_t *)((handle) + (offset)))
! 90: #define bus_space_read_2(tag, handle, offset) \
! 91: ((void)(tag), *(volatile u_int16_t *)((handle) + (offset)))
! 92:
! 93: static void bus_space_read_multi_1(bus_space_tag_t, bus_space_handle_t,
! 94: bus_addr_t, u_int8_t *, size_t);
! 95:
! 96: static __inline__ void
! 97: bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t handle,
! 98: bus_addr_t offset, u_int8_t *dest, size_t count)
! 99: {
! 100: offset += handle;
! 101: while ((int)--count >= 0)
! 102: *dest++ = bus_space_read_1(tag, 0, offset);
! 103: }
! 104:
! 105: static void bus_space_read_multi_2(bus_space_tag_t, bus_space_handle_t,
! 106: bus_addr_t, u_int16_t *, size_t);
! 107:
! 108: static __inline__ void
! 109: bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
! 110: bus_addr_t offset, u_int16_t *dest, size_t count)
! 111: {
! 112: offset += handle;
! 113: while ((int)--count >= 0)
! 114: *dest++ = bus_space_read_2(tag, 0, offset);
! 115: }
! 116:
! 117: static void bus_space_read_raw_multi_2(bus_space_tag_t, bus_space_handle_t,
! 118: bus_addr_t, u_int8_t *, size_t);
! 119:
! 120: static __inline__ void
! 121: bus_space_read_raw_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
! 122: bus_addr_t offset, u_int8_t *dest, size_t size)
! 123: {
! 124: offset += handle;
! 125: size >>= 1;
! 126: while ((int)--size >= 0) {
! 127: *(u_int16_t *)dest =
! 128: bus_space_read_2(tag, 0, offset);
! 129: dest += 2;
! 130: }
! 131: }
! 132:
! 133: static void bus_space_read_region_1(bus_space_tag_t, bus_space_handle_t,
! 134: bus_addr_t, u_int8_t *, size_t);
! 135:
! 136: static __inline__ void
! 137: bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t handle,
! 138: bus_addr_t offset, u_int8_t *dest, size_t count)
! 139: {
! 140: offset += handle;
! 141: while ((int)--count >= 0)
! 142: *dest++ = bus_space_read_1(tag, 0, offset++);
! 143: }
! 144:
! 145: static void bus_space_read_region_2(bus_space_tag_t, bus_space_handle_t,
! 146: bus_addr_t, u_int16_t *, size_t);
! 147:
! 148: static __inline__ void
! 149: bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
! 150: bus_addr_t offset, u_int16_t *dest, size_t count)
! 151: {
! 152: offset += handle;
! 153: while ((int)--count >= 0) {
! 154: *dest++ = bus_space_read_2(tag, 0, offset);
! 155: offset += 2;
! 156: }
! 157: }
! 158:
! 159: static void bus_space_read_raw_region_2(bus_space_tag_t, bus_space_handle_t,
! 160: bus_addr_t, u_int8_t *, size_t);
! 161:
! 162: static __inline__ void
! 163: bus_space_read_raw_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
! 164: bus_addr_t offset, u_int8_t *dest, size_t size)
! 165: {
! 166: size >>= 1;
! 167: offset += handle;
! 168: while ((int)--size >= 0) {
! 169: *(u_int16_t *)dest = bus_space_read_2(tag, 0, offset);
! 170: offset += 2;
! 171: dest += 2;
! 172: }
! 173: }
! 174:
! 175: #define bus_space_write_1(tag, handle, offset, value) \
! 176: ((void)(tag), *(volatile u_int8_t *)((handle) + (offset)) = (value))
! 177: #define bus_space_write_2(tag, handle, offset, value) \
! 178: ((void)(tag), *(volatile u_int16_t *)((handle) + (offset)) = (value))
! 179:
! 180: static void bus_space_write_multi_1(bus_space_tag_t, bus_space_handle_t,
! 181: bus_addr_t, u_int8_t *, size_t);
! 182:
! 183: static __inline__ void
! 184: bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t handle,
! 185: bus_addr_t offset, u_int8_t *dest, size_t count)
! 186: {
! 187: offset += handle;
! 188: while ((int)--count >= 0)
! 189: bus_space_write_1(tag, 0, offset, *dest++);
! 190: }
! 191:
! 192: static void bus_space_write_multi_2(bus_space_tag_t, bus_space_handle_t,
! 193: bus_addr_t, u_int16_t *, size_t);
! 194:
! 195: static __inline__ void
! 196: bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
! 197: bus_addr_t offset, u_int16_t *dest, size_t count)
! 198: {
! 199: offset += handle;
! 200: while ((int)--count >= 0)
! 201: bus_space_write_2(tag, 0, offset, *dest++);
! 202: }
! 203:
! 204: static void bus_space_write_raw_multi_2(bus_space_tag_t, bus_space_handle_t,
! 205: bus_addr_t, u_int8_t *, size_t);
! 206:
! 207: static __inline__ void
! 208: bus_space_write_raw_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
! 209: bus_addr_t offset, u_int8_t *dest, size_t size)
! 210: {
! 211: offset += handle;
! 212: size >>= 1;
! 213: while ((int)--size >= 0) {
! 214: bus_space_write_2(tag, 0, offset, *(u_int16_t *)dest);
! 215: dest += 2;
! 216: }
! 217: }
! 218:
! 219: static void bus_space_set_multi_1(bus_space_tag_t, bus_space_handle_t,
! 220: bus_addr_t, u_int8_t, size_t);
! 221:
! 222: static __inline__ void
! 223: bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t handle,
! 224: bus_addr_t offset, u_int8_t value, size_t count)
! 225: {
! 226: offset += handle;
! 227: while ((int)--count >= 0)
! 228: bus_space_write_1(tag, 0, offset, value);
! 229: }
! 230:
! 231: static void bus_space_set_multi_2(bus_space_tag_t, bus_space_handle_t,
! 232: bus_addr_t, u_int16_t, size_t);
! 233:
! 234: static __inline__ void
! 235: bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
! 236: bus_addr_t offset, u_int16_t value, size_t count)
! 237: {
! 238: offset += handle;
! 239: while ((int)--count >= 0)
! 240: bus_space_write_2(tag, 0, offset, value);
! 241: }
! 242:
! 243: static void bus_space_write_region_1(bus_space_tag_t, bus_space_handle_t,
! 244: bus_addr_t, u_int8_t *, size_t);
! 245:
! 246: static __inline__ void
! 247: bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t handle,
! 248: bus_addr_t offset, u_int8_t *dest, size_t count)
! 249: {
! 250: offset += handle;
! 251: while ((int)--count >= 0)
! 252: bus_space_write_1(tag, 0, offset++, *dest++);
! 253: }
! 254:
! 255: static void bus_space_write_region_2(bus_space_tag_t, bus_space_handle_t,
! 256: bus_addr_t, u_int16_t *, size_t);
! 257:
! 258: static __inline__ void
! 259: bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
! 260: bus_addr_t offset, u_int16_t *dest, size_t count)
! 261: {
! 262: offset += handle;
! 263: while ((int)--count >= 0) {
! 264: bus_space_write_2(tag, 0, offset, *dest++);
! 265: offset += 2;
! 266: }
! 267: }
! 268:
! 269: static void bus_space_write_raw_region_2(bus_space_tag_t, bus_space_handle_t,
! 270: bus_addr_t, u_int8_t *, size_t);
! 271:
! 272: static __inline__ void
! 273: bus_space_write_raw_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
! 274: bus_addr_t offset, u_int8_t *dest, size_t size)
! 275: {
! 276: offset += handle;
! 277: size >>= 1;
! 278: while ((int)--size >= 0) {
! 279: bus_space_write_2(tag, 0, offset, *(u_int16_t *)dest);
! 280: offset += 2;
! 281: dest += 2;
! 282: }
! 283: }
! 284:
! 285: static void bus_space_set_region_1(bus_space_tag_t, bus_space_handle_t,
! 286: bus_addr_t, u_int8_t, size_t);
! 287:
! 288: static __inline__ void
! 289: bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t handle,
! 290: bus_addr_t offset, u_int8_t value, size_t count)
! 291: {
! 292: offset += handle;
! 293: while ((int)--count >= 0)
! 294: bus_space_write_1(tag, 0, offset++, value);
! 295: }
! 296:
! 297: static void bus_space_set_region_2(bus_space_tag_t, bus_space_handle_t,
! 298: bus_addr_t, u_int16_t, size_t);
! 299:
! 300: static __inline__ void
! 301: bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
! 302: bus_addr_t offset, u_int16_t value, size_t count)
! 303: {
! 304: offset += handle;
! 305: while ((int)--count >= 0) {
! 306: bus_space_write_2(tag, 0, offset, value);
! 307: offset += 2;
! 308: }
! 309: }
! 310:
! 311: static void bus_space_copy_1(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
! 312: bus_space_handle_t, bus_addr_t, bus_size_t);
! 313:
! 314: static __inline__ void
! 315: bus_space_copy_1(bus_space_tag_t tag, bus_space_handle_t h1, bus_addr_t o1,
! 316: bus_space_handle_t h2, bus_addr_t o2, bus_size_t count)
! 317: {
! 318: o1 += h1;
! 319: o2 += h2;
! 320: while ((int)--count >= 0) {
! 321: *((volatile u_int8_t *)o1)++ = *((volatile u_int8_t *)o2)++;
! 322: }
! 323: }
! 324:
! 325: static void bus_space_copy_2(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
! 326: bus_space_handle_t, bus_addr_t, bus_size_t);
! 327:
! 328: static __inline__ void
! 329: bus_space_copy_2(bus_space_tag_t tag, bus_space_handle_t h1, bus_addr_t o1,
! 330: bus_space_handle_t h2, bus_addr_t o2, bus_size_t count)
! 331: {
! 332: o1 += h1;
! 333: o2 += h2;
! 334: while ((int)--count >= 0) {
! 335: *(volatile u_int16_t *)o1 = *(volatile u_int16_t *)o2;
! 336: o1 += 2;
! 337: o2 += 2;
! 338: }
! 339: }
! 340:
! 341: /*
! 342: * Unrestricted D32 access
! 343: */
! 344:
! 345: #ifndef __BUS_SPACE_RESTRICT_D16__
! 346:
! 347: #define bus_space_read_4(tag, handle, offset) \
! 348: ((void)(tag), *(volatile u_int32_t *)((handle) + (offset)))
! 349:
! 350: static void bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t,
! 351: bus_addr_t, u_int32_t *, size_t);
! 352:
! 353: static __inline__ void
! 354: bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 355: bus_addr_t offset, u_int32_t *dest, size_t count)
! 356: {
! 357: offset += handle;
! 358: while ((int)--count >= 0)
! 359: *dest++ = bus_space_read_4(tag, 0, offset);
! 360: }
! 361:
! 362: static void bus_space_read_raw_multi_4(bus_space_tag_t, bus_space_handle_t,
! 363: bus_addr_t, u_int8_t *, size_t);
! 364:
! 365: static __inline__ void
! 366: bus_space_read_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 367: bus_addr_t offset, u_int8_t *dest, size_t size)
! 368: {
! 369: offset += handle;
! 370: size >>= 2;
! 371: while ((int)--size >= 0) {
! 372: *(u_int32_t *)dest =
! 373: bus_space_read_4(tag, 0, offset);
! 374: dest += 4;
! 375: }
! 376: }
! 377:
! 378: static void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t,
! 379: bus_addr_t, u_int32_t *, size_t);
! 380:
! 381: static __inline__ void
! 382: bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 383: bus_addr_t offset, u_int32_t *dest, size_t count)
! 384: {
! 385: offset += handle;
! 386: while ((int)--count >= 0) {
! 387: *dest++ = bus_space_read_4(tag, 0, offset);
! 388: offset += 4;
! 389: }
! 390: }
! 391:
! 392: static void bus_space_read_raw_region_4(bus_space_tag_t, bus_space_handle_t,
! 393: bus_addr_t, u_int8_t *, size_t);
! 394:
! 395: static __inline__ void
! 396: bus_space_read_raw_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 397: bus_addr_t offset, u_int8_t *dest, size_t size)
! 398: {
! 399: size >>= 2;
! 400: offset += handle;
! 401: while ((int)--size >= 0) {
! 402: *(u_int32_t *)dest = bus_space_read_4(tag, 0, offset);
! 403: offset += 4;
! 404: dest += 4;
! 405: }
! 406: }
! 407:
! 408: #define bus_space_write_4(tag, handle, offset, value) \
! 409: ((void)(tag), *(volatile u_int32_t *)((handle) + (offset)) = (value))
! 410:
! 411: static void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t,
! 412: bus_addr_t, u_int32_t *, size_t);
! 413:
! 414: static __inline__ void
! 415: bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 416: bus_addr_t offset, u_int32_t *dest, size_t count)
! 417: {
! 418: offset += handle;
! 419: while ((int)--count >= 0)
! 420: bus_space_write_4(tag, 0, offset, *dest++);
! 421: }
! 422:
! 423: static void bus_space_write_raw_multi_4(bus_space_tag_t, bus_space_handle_t,
! 424: bus_addr_t, u_int8_t *, size_t);
! 425:
! 426: static __inline__ void
! 427: bus_space_write_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 428: bus_addr_t offset, u_int8_t *dest, size_t size)
! 429: {
! 430: offset += handle;
! 431: size >>= 2;
! 432: while ((int)--size >= 0) {
! 433: bus_space_write_4(tag, 0, offset, *(u_int32_t *)dest);
! 434: dest += 4;
! 435: }
! 436: }
! 437:
! 438: static void bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t,
! 439: bus_addr_t, u_int32_t, size_t);
! 440:
! 441: static __inline__ void
! 442: bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 443: bus_addr_t offset, u_int32_t value, size_t count)
! 444: {
! 445: offset += handle;
! 446: while ((int)--count >= 0)
! 447: bus_space_write_4(tag, 0, offset, value);
! 448: }
! 449:
! 450: static void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t,
! 451: bus_addr_t, u_int32_t *, size_t);
! 452:
! 453: static __inline__ void
! 454: bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 455: bus_addr_t offset, u_int32_t *dest, size_t count)
! 456: {
! 457: offset += handle;
! 458: while ((int)--count >= 0) {
! 459: bus_space_write_4(tag, 0, offset, *dest++);
! 460: offset += 4;
! 461: }
! 462: }
! 463:
! 464: static void bus_space_write_raw_region_4(bus_space_tag_t, bus_space_handle_t,
! 465: bus_addr_t, u_int8_t *, size_t);
! 466:
! 467: static __inline__ void
! 468: bus_space_write_raw_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 469: bus_addr_t offset, u_int8_t *dest, size_t size)
! 470: {
! 471: offset += handle;
! 472: size >>= 2;
! 473: while ((int)--size >= 0) {
! 474: bus_space_write_4(tag, 0, offset, *(u_int32_t *)dest);
! 475: offset += 4;
! 476: dest += 4;
! 477: }
! 478: }
! 479:
! 480: static void bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t,
! 481: bus_addr_t, u_int32_t, size_t);
! 482:
! 483: static __inline__ void
! 484: bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 485: bus_addr_t offset, u_int32_t value, size_t count)
! 486: {
! 487: offset += handle;
! 488: while ((int)--count >= 0) {
! 489: bus_space_write_4(tag, 0, offset, value);
! 490: offset += 4;
! 491: }
! 492: }
! 493:
! 494: static void bus_space_copy_4(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
! 495: bus_space_handle_t, bus_addr_t, bus_size_t);
! 496:
! 497: static __inline__ void
! 498: bus_space_copy_4(bus_space_tag_t tag, bus_space_handle_t h1, bus_addr_t o1,
! 499: bus_space_handle_t h2, bus_addr_t o2, bus_size_t count)
! 500: {
! 501: o1 += h1;
! 502: o2 += h2;
! 503: while ((int)--count >= 0) {
! 504: *(volatile u_int32_t *)o1 = *(volatile u_int32_t *)o2;
! 505: o1 += 4;
! 506: o2 += 4;
! 507: }
! 508: }
! 509:
! 510: #else /* __BUS_SPACE_RESTRICT_D16__ */
! 511:
! 512: /*
! 513: * Restricted D32 access - done through two adjacent D16 access.
! 514: *
! 515: * The speed of the basic read and write routines is critical.
! 516: * This implementation uses a temporary variable on stack, and does
! 517: * two 16 bit load&store sequences. Since the stack is in Dcache, this
! 518: * is faster and spills fewer register than a register-only sequence
! 519: * (which would need to ld.h into two distinct registers, then extu
! 520: * the second one into itself, and or both in the result register).
! 521: */
! 522:
! 523: static u_int32_t d16_read_4(vaddr_t);
! 524: static void d16_write_4(vaddr_t, u_int32_t);
! 525:
! 526: static __inline__ u_int32_t
! 527: d16_read_4(vaddr_t va)
! 528: {
! 529: u_int32_t tmp;
! 530:
! 531: *(u_int16_t *)&tmp = *(volatile u_int16_t *)va;
! 532: *(u_int16_t *)((vaddr_t)&tmp + 2) = *(volatile u_int16_t *)(va + 2);
! 533:
! 534: return tmp;
! 535: }
! 536:
! 537: static __inline__ void
! 538: d16_write_4(vaddr_t va, u_int32_t value)
! 539: {
! 540: u_int32_t tmp = value;
! 541:
! 542: *(volatile u_int16_t *)va = *(u_int16_t *)&tmp;
! 543: *(volatile u_int16_t *)(va + 2) = *(u_int16_t *)((vaddr_t)&tmp + 2);
! 544: }
! 545:
! 546: #define bus_space_read_4(tag, handle, offset) \
! 547: ((void)(tag), d16_read_4((handle) + (offset)))
! 548:
! 549: static void bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t,
! 550: bus_addr_t, u_int32_t *, size_t);
! 551:
! 552: static __inline__ void
! 553: bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 554: bus_addr_t offset, u_int32_t *dest, size_t count)
! 555: {
! 556: offset += handle;
! 557: while ((int)--count >= 0)
! 558: *dest++ = bus_space_read_4(tag, 0, offset);
! 559: }
! 560:
! 561: static void bus_space_read_raw_multi_4(bus_space_tag_t, bus_space_handle_t,
! 562: bus_addr_t, u_int8_t *, size_t);
! 563:
! 564: static __inline__ void
! 565: bus_space_read_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 566: bus_addr_t offset, u_int8_t *dest, size_t size)
! 567: {
! 568: offset += handle;
! 569: size >>= 1;
! 570: while ((int)--size >= 0) {
! 571: *(u_int16_t *)dest = bus_space_read_2(tag, 0, offset);
! 572: dest += 2;
! 573: }
! 574: }
! 575:
! 576: static void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t,
! 577: bus_addr_t, u_int32_t *, size_t);
! 578:
! 579: static __inline__ void
! 580: bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 581: bus_addr_t offset, u_int32_t *__dest, size_t count)
! 582: {
! 583: u_int16_t *dest = (u_int16_t *)__dest;
! 584:
! 585: offset += handle;
! 586: count <<= 1;
! 587: while ((int)--count >= 0) {
! 588: *dest++ = bus_space_read_2(tag, 0, offset);
! 589: offset += 2;
! 590: }
! 591: }
! 592:
! 593: static void bus_space_read_raw_region_4(bus_space_tag_t, bus_space_handle_t,
! 594: bus_addr_t, u_int8_t *, size_t);
! 595:
! 596: static __inline__ void
! 597: bus_space_read_raw_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 598: bus_addr_t offset, u_int8_t *dest, size_t size)
! 599: {
! 600: size >>= 1;
! 601: offset += handle;
! 602: while ((int)--size >= 0) {
! 603: *(u_int16_t *)dest = bus_space_read_2(tag, 0, offset);
! 604: offset += 2;
! 605: dest += 2;
! 606: }
! 607: }
! 608:
! 609: #define bus_space_write_4(tag, handle, offset, value) \
! 610: ((void)(tag), d16_write_4((handle) + (offset), (value)))
! 611:
! 612: static void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t,
! 613: bus_addr_t, u_int32_t *, size_t);
! 614:
! 615: static __inline__ void
! 616: bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 617: bus_addr_t offset, u_int32_t *dest, size_t count)
! 618: {
! 619: offset += handle;
! 620: while ((int)--count >= 0)
! 621: bus_space_write_4(tag, 0, offset, *dest++);
! 622: }
! 623:
! 624: static void bus_space_write_raw_multi_4(bus_space_tag_t, bus_space_handle_t,
! 625: bus_addr_t, u_int8_t *, size_t);
! 626:
! 627: static __inline__ void
! 628: bus_space_write_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 629: bus_addr_t offset, u_int8_t *dest, size_t size)
! 630: {
! 631: offset += handle;
! 632: size >>= 1;
! 633: while ((int)--size >= 0) {
! 634: bus_space_write_2(tag, 0, offset, *(u_int16_t *)dest);
! 635: dest += 2;
! 636: }
! 637: }
! 638:
! 639: static void bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t,
! 640: bus_addr_t, u_int32_t, size_t);
! 641:
! 642: static __inline__ void
! 643: bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 644: bus_addr_t offset, u_int32_t value, size_t count)
! 645: {
! 646: offset += handle;
! 647: while ((int)--count >= 0)
! 648: bus_space_write_4(tag, 0, offset, value);
! 649: }
! 650:
! 651: static void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t,
! 652: bus_addr_t, u_int32_t *, size_t);
! 653:
! 654: static __inline__ void
! 655: bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 656: bus_addr_t offset, u_int32_t *__dest, size_t count)
! 657: {
! 658: u_int16_t *dest = (u_int16_t *)__dest;
! 659:
! 660: offset += handle;
! 661: count <<= 1;
! 662: while ((int)--count >= 0) {
! 663: bus_space_write_2(tag, 0, offset, *dest++);
! 664: offset += 2;
! 665: }
! 666: }
! 667:
! 668: static void bus_space_write_raw_region_4(bus_space_tag_t, bus_space_handle_t,
! 669: bus_addr_t, u_int8_t *, size_t);
! 670:
! 671: static __inline__ void
! 672: bus_space_write_raw_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 673: bus_addr_t offset, u_int8_t *dest, size_t size)
! 674: {
! 675: offset += handle;
! 676: size >>= 1;
! 677: while ((int)--size >= 0) {
! 678: bus_space_write_2(tag, 0, offset, *(u_int16_t *)dest);
! 679: offset += 2;
! 680: dest += 2;
! 681: }
! 682: }
! 683:
! 684: static void bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t,
! 685: bus_addr_t, u_int32_t, size_t);
! 686:
! 687: static __inline__ void
! 688: bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
! 689: bus_addr_t offset, u_int32_t value, size_t count)
! 690: {
! 691: offset += handle;
! 692: while ((int)--count >= 0) {
! 693: bus_space_write_4(tag, 0, offset, value);
! 694: offset += 4;
! 695: }
! 696: }
! 697:
! 698: static void bus_space_copy_4(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
! 699: bus_space_handle_t, bus_addr_t, bus_size_t);
! 700:
! 701: static __inline__ void
! 702: bus_space_copy_4(bus_space_tag_t tag, bus_space_handle_t h1, bus_addr_t o1,
! 703: bus_space_handle_t h2, bus_addr_t o2, bus_size_t count)
! 704: {
! 705: o1 += h1;
! 706: o2 += h2;
! 707: count <<= 1;
! 708: while ((int)--count >= 0) {
! 709: *(volatile u_int16_t *)o1 = *(volatile u_int16_t *)o2;
! 710: o1 += 2;
! 711: o2 += 2;
! 712: }
! 713: }
! 714:
! 715: /*
! 716: * Extra D16 access functions (see vme.c)
! 717: */
! 718:
! 719: void d16_bcopy(const void *, void *, size_t);
! 720: void d16_bzero(void *, size_t);
! 721:
! 722: #endif /* __BUS_SPACE_RESTRICT_D16__ */
! 723:
! 724: #endif /* _AVIION_BUS_H_ */
CVSweb