Annotation of sys/arch/alpha/pci/pci_bwx_bus_io_chipdep.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: pci_bwx_bus_io_chipdep.c,v 1.5 2003/09/02 17:25:21 miod Exp $ */
! 2: /* $NetBSD: pcs_bus_io_common.c,v 1.14 1996/12/02 22:19:35 cgd Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1995, 1996 Carnegie-Mellon University.
! 6: * All rights reserved.
! 7: *
! 8: * Author: Chris G. Demetriou
! 9: *
! 10: * Permission to use, copy, modify and distribute this software and
! 11: * its documentation is hereby granted, provided that both the copyright
! 12: * notice and this permission notice appear in all copies of the
! 13: * software, derivative works or modified versions, and any portions
! 14: * thereof, and that both notices appear in supporting documentation.
! 15: *
! 16: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
! 17: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
! 18: * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
! 19: *
! 20: * Carnegie Mellon requests users of this software to return to
! 21: *
! 22: * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
! 23: * School of Computer Science
! 24: * Carnegie Mellon University
! 25: * Pittsburgh PA 15213-3890
! 26: *
! 27: * any improvements or extensions that they make and grant Carnegie the
! 28: * rights to redistribute these changes.
! 29: */
! 30:
! 31: /*
! 32: * Common PCI Chipset "bus I/O" functions, for chipsets which have to
! 33: * deal with only a single PCI interface chip in a machine.
! 34: *
! 35: * uses:
! 36: * CHIP name of the 'chip' it's being compiled for.
! 37: * CHIP_IO_BASE Sparse I/O space base to use.
! 38: */
! 39:
! 40: #include <sys/extent.h>
! 41:
! 42: #include <machine/bwx.h>
! 43:
! 44: #define __C(A,B) __CONCAT(A,B)
! 45: #define __S(S) __STRING(S)
! 46:
! 47: #ifndef CHIP_EXTENT_NAME
! 48: #define CHIP_EXTENT_NAME(v) __S(__C(CHIP,_bus_io))
! 49: #endif
! 50:
! 51: #ifndef CHIP_EXTENT_STORAGE
! 52: #define CHIP_EXTENT_STORAGE(v) __C(CHIP,_io_ex_storage)
! 53: static long
! 54: __C(CHIP,_io_ex_storage)[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
! 55: #endif
! 56:
! 57: /* mapping/unmapping */
! 58: int __C(CHIP,_io_map)(void *, bus_addr_t, bus_size_t, int,
! 59: bus_space_handle_t *);
! 60: void __C(CHIP,_io_unmap)(void *, bus_space_handle_t,
! 61: bus_size_t);
! 62: int __C(CHIP,_io_subregion)(void *, bus_space_handle_t,
! 63: bus_size_t, bus_size_t, bus_space_handle_t *);
! 64:
! 65: /* allocation/deallocation */
! 66: int __C(CHIP,_io_alloc)(void *, bus_addr_t, bus_addr_t,
! 67: bus_size_t, bus_size_t, bus_addr_t, int, bus_addr_t *,
! 68: bus_space_handle_t *);
! 69: void __C(CHIP,_io_free)(void *, bus_space_handle_t,
! 70: bus_size_t);
! 71:
! 72: /* barrier */
! 73: inline void __C(CHIP,_io_barrier)(void *, bus_space_handle_t,
! 74: bus_size_t, bus_size_t, int);
! 75:
! 76: /* read (single) */
! 77: inline u_int8_t __C(CHIP,_io_read_1)(void *, bus_space_handle_t,
! 78: bus_size_t);
! 79: inline u_int16_t __C(CHIP,_io_read_2)(void *, bus_space_handle_t,
! 80: bus_size_t);
! 81: inline u_int32_t __C(CHIP,_io_read_4)(void *, bus_space_handle_t,
! 82: bus_size_t);
! 83: inline u_int64_t __C(CHIP,_io_read_8)(void *, bus_space_handle_t,
! 84: bus_size_t);
! 85:
! 86: /* read multiple */
! 87: void __C(CHIP,_io_read_multi_1)(void *, bus_space_handle_t,
! 88: bus_size_t, u_int8_t *, bus_size_t);
! 89: void __C(CHIP,_io_read_multi_2)(void *, bus_space_handle_t,
! 90: bus_size_t, u_int16_t *, bus_size_t);
! 91: void __C(CHIP,_io_read_multi_4)(void *, bus_space_handle_t,
! 92: bus_size_t, u_int32_t *, bus_size_t);
! 93: void __C(CHIP,_io_read_multi_8)(void *, bus_space_handle_t,
! 94: bus_size_t, u_int64_t *, bus_size_t);
! 95:
! 96: /* read region */
! 97: void __C(CHIP,_io_read_region_1)(void *, bus_space_handle_t,
! 98: bus_size_t, u_int8_t *, bus_size_t);
! 99: void __C(CHIP,_io_read_region_2)(void *, bus_space_handle_t,
! 100: bus_size_t, u_int16_t *, bus_size_t);
! 101: void __C(CHIP,_io_read_region_4)(void *, bus_space_handle_t,
! 102: bus_size_t, u_int32_t *, bus_size_t);
! 103: void __C(CHIP,_io_read_region_8)(void *, bus_space_handle_t,
! 104: bus_size_t, u_int64_t *, bus_size_t);
! 105:
! 106: /* write (single) */
! 107: inline void __C(CHIP,_io_write_1)(void *, bus_space_handle_t,
! 108: bus_size_t, u_int8_t);
! 109: inline void __C(CHIP,_io_write_2)(void *, bus_space_handle_t,
! 110: bus_size_t, u_int16_t);
! 111: inline void __C(CHIP,_io_write_4)(void *, bus_space_handle_t,
! 112: bus_size_t, u_int32_t);
! 113: inline void __C(CHIP,_io_write_8)(void *, bus_space_handle_t,
! 114: bus_size_t, u_int64_t);
! 115:
! 116: /* write multiple */
! 117: void __C(CHIP,_io_write_multi_1)(void *, bus_space_handle_t,
! 118: bus_size_t, const u_int8_t *, bus_size_t);
! 119: void __C(CHIP,_io_write_multi_2)(void *, bus_space_handle_t,
! 120: bus_size_t, const u_int16_t *, bus_size_t);
! 121: void __C(CHIP,_io_write_multi_4)(void *, bus_space_handle_t,
! 122: bus_size_t, const u_int32_t *, bus_size_t);
! 123: void __C(CHIP,_io_write_multi_8)(void *, bus_space_handle_t,
! 124: bus_size_t, const u_int64_t *, bus_size_t);
! 125:
! 126: /* write region */
! 127: void __C(CHIP,_io_write_region_1)(void *, bus_space_handle_t,
! 128: bus_size_t, const u_int8_t *, bus_size_t);
! 129: void __C(CHIP,_io_write_region_2)(void *, bus_space_handle_t,
! 130: bus_size_t, const u_int16_t *, bus_size_t);
! 131: void __C(CHIP,_io_write_region_4)(void *, bus_space_handle_t,
! 132: bus_size_t, const u_int32_t *, bus_size_t);
! 133: void __C(CHIP,_io_write_region_8)(void *, bus_space_handle_t,
! 134: bus_size_t, const u_int64_t *, bus_size_t);
! 135:
! 136: /* set multiple */
! 137: void __C(CHIP,_io_set_multi_1)(void *, bus_space_handle_t,
! 138: bus_size_t, u_int8_t, bus_size_t);
! 139: void __C(CHIP,_io_set_multi_2)(void *, bus_space_handle_t,
! 140: bus_size_t, u_int16_t, bus_size_t);
! 141: void __C(CHIP,_io_set_multi_4)(void *, bus_space_handle_t,
! 142: bus_size_t, u_int32_t, bus_size_t);
! 143: void __C(CHIP,_io_set_multi_8)(void *, bus_space_handle_t,
! 144: bus_size_t, u_int64_t, bus_size_t);
! 145:
! 146: /* set region */
! 147: void __C(CHIP,_io_set_region_1)(void *, bus_space_handle_t,
! 148: bus_size_t, u_int8_t, bus_size_t);
! 149: void __C(CHIP,_io_set_region_2)(void *, bus_space_handle_t,
! 150: bus_size_t, u_int16_t, bus_size_t);
! 151: void __C(CHIP,_io_set_region_4)(void *, bus_space_handle_t,
! 152: bus_size_t, u_int32_t, bus_size_t);
! 153: void __C(CHIP,_io_set_region_8)(void *, bus_space_handle_t,
! 154: bus_size_t, u_int64_t, bus_size_t);
! 155:
! 156: /* copy */
! 157: void __C(CHIP,_io_copy_1)(void *, bus_space_handle_t,
! 158: bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
! 159: void __C(CHIP,_io_copy_2)(void *, bus_space_handle_t,
! 160: bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
! 161: void __C(CHIP,_io_copy_4)(void *, bus_space_handle_t,
! 162: bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
! 163: void __C(CHIP,_io_copy_8)(void *, bus_space_handle_t,
! 164: bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
! 165:
! 166: /* read multiple raw */
! 167: void __C(CHIP,_io_read_raw_multi_2)(void *, bus_space_handle_t,
! 168: bus_size_t, u_int8_t *, bus_size_t);
! 169: void __C(CHIP,_io_read_raw_multi_4)(void *, bus_space_handle_t,
! 170: bus_size_t, u_int8_t *, bus_size_t);
! 171: void __C(CHIP,_io_read_raw_multi_8)(void *, bus_space_handle_t,
! 172: bus_size_t, u_int8_t *, bus_size_t);
! 173:
! 174: /* write multiple raw */
! 175: void __C(CHIP,_io_write_raw_multi_2)(void *,
! 176: bus_space_handle_t, bus_size_t, const u_int8_t *,
! 177: bus_size_t);
! 178: void __C(CHIP,_io_write_raw_multi_4)(void *,
! 179: bus_space_handle_t, bus_size_t, const u_int8_t *,
! 180: bus_size_t);
! 181: void __C(CHIP,_io_write_raw_multi_8)(void *,
! 182: bus_space_handle_t, bus_size_t, const u_int8_t *,
! 183: bus_size_t);
! 184:
! 185: void
! 186: __C(CHIP,_bus_io_init)(t, v)
! 187: bus_space_tag_t t;
! 188: void *v;
! 189: {
! 190: struct extent *ex;
! 191:
! 192: /*
! 193: * Initialize the bus space tag.
! 194: */
! 195:
! 196: /* cookie */
! 197: t->abs_cookie = v;
! 198:
! 199: /* mapping/unmapping */
! 200: t->abs_map = __C(CHIP,_io_map);
! 201: t->abs_unmap = __C(CHIP,_io_unmap);
! 202: t->abs_subregion = __C(CHIP,_io_subregion);
! 203:
! 204: /* allocation/deallocation */
! 205: t->abs_alloc = __C(CHIP,_io_alloc);
! 206: t->abs_free = __C(CHIP,_io_free);
! 207:
! 208: /* barrier */
! 209: t->abs_barrier = __C(CHIP,_io_barrier);
! 210:
! 211: /* read (single) */
! 212: t->abs_r_1 = __C(CHIP,_io_read_1);
! 213: t->abs_r_2 = __C(CHIP,_io_read_2);
! 214: t->abs_r_4 = __C(CHIP,_io_read_4);
! 215: t->abs_r_8 = __C(CHIP,_io_read_8);
! 216:
! 217: /* read multiple */
! 218: t->abs_rm_1 = __C(CHIP,_io_read_multi_1);
! 219: t->abs_rm_2 = __C(CHIP,_io_read_multi_2);
! 220: t->abs_rm_4 = __C(CHIP,_io_read_multi_4);
! 221: t->abs_rm_8 = __C(CHIP,_io_read_multi_8);
! 222:
! 223: /* read region */
! 224: t->abs_rr_1 = __C(CHIP,_io_read_region_1);
! 225: t->abs_rr_2 = __C(CHIP,_io_read_region_2);
! 226: t->abs_rr_4 = __C(CHIP,_io_read_region_4);
! 227: t->abs_rr_8 = __C(CHIP,_io_read_region_8);
! 228:
! 229: /* write (single) */
! 230: t->abs_w_1 = __C(CHIP,_io_write_1);
! 231: t->abs_w_2 = __C(CHIP,_io_write_2);
! 232: t->abs_w_4 = __C(CHIP,_io_write_4);
! 233: t->abs_w_8 = __C(CHIP,_io_write_8);
! 234:
! 235: /* write multiple */
! 236: t->abs_wm_1 = __C(CHIP,_io_write_multi_1);
! 237: t->abs_wm_2 = __C(CHIP,_io_write_multi_2);
! 238: t->abs_wm_4 = __C(CHIP,_io_write_multi_4);
! 239: t->abs_wm_8 = __C(CHIP,_io_write_multi_8);
! 240:
! 241: /* write region */
! 242: t->abs_wr_1 = __C(CHIP,_io_write_region_1);
! 243: t->abs_wr_2 = __C(CHIP,_io_write_region_2);
! 244: t->abs_wr_4 = __C(CHIP,_io_write_region_4);
! 245: t->abs_wr_8 = __C(CHIP,_io_write_region_8);
! 246:
! 247: /* set multiple */
! 248: t->abs_sm_1 = __C(CHIP,_io_set_multi_1);
! 249: t->abs_sm_2 = __C(CHIP,_io_set_multi_2);
! 250: t->abs_sm_4 = __C(CHIP,_io_set_multi_4);
! 251: t->abs_sm_8 = __C(CHIP,_io_set_multi_8);
! 252:
! 253: /* set region */
! 254: t->abs_sr_1 = __C(CHIP,_io_set_region_1);
! 255: t->abs_sr_2 = __C(CHIP,_io_set_region_2);
! 256: t->abs_sr_4 = __C(CHIP,_io_set_region_4);
! 257: t->abs_sr_8 = __C(CHIP,_io_set_region_8);
! 258:
! 259: /* copy */
! 260: t->abs_c_1 = __C(CHIP,_io_copy_1);
! 261: t->abs_c_2 = __C(CHIP,_io_copy_2);
! 262: t->abs_c_4 = __C(CHIP,_io_copy_4);
! 263: t->abs_c_8 = __C(CHIP,_io_copy_8);
! 264:
! 265: /* read multiple raw */
! 266: t->abs_rrm_2 = __C(CHIP,_io_read_raw_multi_2);
! 267: t->abs_rrm_4 = __C(CHIP,_io_read_raw_multi_4);
! 268: t->abs_rrm_8 = __C(CHIP,_io_read_raw_multi_8);
! 269:
! 270: /* write multiple raw*/
! 271: t->abs_wrm_2 = __C(CHIP,_io_write_raw_multi_2);
! 272: t->abs_wrm_4 = __C(CHIP,_io_write_raw_multi_4);
! 273: t->abs_wrm_8 = __C(CHIP,_io_write_raw_multi_8);
! 274:
! 275: ex = extent_create(CHIP_EXTENT_NAME(v), 0x0UL, 0xffffffffUL,
! 276: M_DEVBUF, (caddr_t)CHIP_EXTENT_STORAGE(v),
! 277: sizeof(CHIP_EXTENT_STORAGE(v)), EX_NOWAIT|EX_NOCOALESCE);
! 278:
! 279: CHIP_IO_EXTENT(v) = ex;
! 280: }
! 281:
! 282: int
! 283: __C(CHIP,_io_map)(v, ioaddr, iosize, cacheable, iohp)
! 284: void *v;
! 285: bus_addr_t ioaddr;
! 286: bus_size_t iosize;
! 287: int cacheable;
! 288: bus_space_handle_t *iohp;
! 289: {
! 290: int error;
! 291:
! 292: #ifdef EXTENT_DEBUG
! 293: printf("io: allocating 0x%lx to 0x%lx\n", ioaddr, ioaddr + iosize - 1);
! 294: #endif
! 295: error = extent_alloc_region(CHIP_IO_EXTENT(v), ioaddr, iosize,
! 296: EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
! 297: if (error) {
! 298: #ifdef EXTENT_DEBUG
! 299: printf("io: allocation failed (%d)\n", error);
! 300: extent_print(CHIP_IO_EXTENT(v));
! 301: #endif
! 302: return (error);
! 303: }
! 304:
! 305: *iohp = ALPHA_PHYS_TO_K0SEG(CHIP_IO_SYS_START(v)) + ioaddr;
! 306:
! 307: return (0);
! 308: }
! 309:
! 310: void
! 311: __C(CHIP,_io_unmap)(v, ioh, iosize)
! 312: void *v;
! 313: bus_space_handle_t ioh;
! 314: bus_size_t iosize;
! 315: {
! 316: bus_addr_t ioaddr;
! 317: int error;
! 318:
! 319: #ifdef EXTENT_DEBUG
! 320: printf("io: freeing handle 0x%lx for 0x%lx\n", ioh, iosize);
! 321: #endif
! 322:
! 323: ioaddr = ioh - ALPHA_PHYS_TO_K0SEG(CHIP_IO_SYS_START(v));
! 324:
! 325: #ifdef EXTENT_DEBUG
! 326: printf("io: freeing 0x%lx to 0x%lx\n", ioaddr, ioaddr + iosize - 1);
! 327: #endif
! 328: error = extent_free(CHIP_IO_EXTENT(v), ioaddr, iosize,
! 329: EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
! 330: if (error) {
! 331: printf("%s: WARNING: could not unmap 0x%lx-0x%lx (error %d)\n",
! 332: __S(__C(CHIP,_io_unmap)), ioaddr, ioaddr + iosize - 1,
! 333: error);
! 334: #ifdef EXTENT_DEBUG
! 335: extent_print(CHIP_IO_EXTENT(v));
! 336: #endif
! 337: }
! 338: }
! 339:
! 340: int
! 341: __C(CHIP,_io_subregion)(v, ioh, offset, size, nioh)
! 342: void *v;
! 343: bus_space_handle_t ioh, *nioh;
! 344: bus_size_t offset, size;
! 345: {
! 346:
! 347: *nioh = ioh + offset;
! 348: return (0);
! 349: }
! 350:
! 351: int
! 352: __C(CHIP,_io_alloc)(v, rstart, rend, size, align, boundary, cacheable,
! 353: addrp, bshp)
! 354: void *v;
! 355: bus_addr_t rstart, rend, *addrp;
! 356: bus_size_t size, align, boundary;
! 357: int cacheable;
! 358: bus_space_handle_t *bshp;
! 359: {
! 360:
! 361: /* XXX XXX XXX XXX XXX XXX */
! 362: panic("%s not implemented", __S(__C(CHIP,_io_alloc)));
! 363: }
! 364:
! 365: void
! 366: __C(CHIP,_io_free)(v, bsh, size)
! 367: void *v;
! 368: bus_space_handle_t bsh;
! 369: bus_size_t size;
! 370: {
! 371:
! 372: /* XXX XXX XXX XXX XXX XXX */
! 373: panic("%s not implemented", __S(__C(CHIP,_io_free)));
! 374: }
! 375:
! 376: inline void
! 377: __C(CHIP,_io_barrier)(v, h, o, l, f)
! 378: void *v;
! 379: bus_space_handle_t h;
! 380: bus_size_t o, l;
! 381: int f;
! 382: {
! 383:
! 384: if ((f & BUS_BARRIER_READ) != 0)
! 385: alpha_mb();
! 386: else if ((f & BUS_BARRIER_WRITE) != 0)
! 387: alpha_wmb();
! 388: }
! 389:
! 390: inline u_int8_t
! 391: __C(CHIP,_io_read_1)(v, ioh, off)
! 392: void *v;
! 393: bus_space_handle_t ioh;
! 394: bus_size_t off;
! 395: {
! 396: bus_addr_t addr;
! 397:
! 398: addr = ioh + off;
! 399: alpha_mb();
! 400: return (alpha_ldbu((u_int8_t *)addr));
! 401: }
! 402:
! 403: inline u_int16_t
! 404: __C(CHIP,_io_read_2)(v, ioh, off)
! 405: void *v;
! 406: bus_space_handle_t ioh;
! 407: bus_size_t off;
! 408: {
! 409: bus_addr_t addr;
! 410:
! 411: addr = ioh + off;
! 412: #ifdef DIAGNOSTIC
! 413: if (addr & 1)
! 414: panic(__S(__C(CHIP,_io_read_2)) ": addr 0x%lx not aligned",
! 415: addr);
! 416: #endif
! 417: alpha_mb();
! 418: return (alpha_ldwu((u_int16_t *)addr));
! 419: }
! 420:
! 421: inline u_int32_t
! 422: __C(CHIP,_io_read_4)(v, ioh, off)
! 423: void *v;
! 424: bus_space_handle_t ioh;
! 425: bus_size_t off;
! 426: {
! 427: bus_addr_t addr;
! 428:
! 429: addr = ioh + off;
! 430: #ifdef DIAGNOSTIC
! 431: if (addr & 3)
! 432: panic(__S(__C(CHIP,_io_read_4)) ": addr 0x%lx not aligned",
! 433: addr);
! 434: #endif
! 435: alpha_mb();
! 436: return (*(u_int32_t *)addr);
! 437: }
! 438:
! 439: inline u_int64_t
! 440: __C(CHIP,_io_read_8)(v, ioh, off)
! 441: void *v;
! 442: bus_space_handle_t ioh;
! 443: bus_size_t off;
! 444: {
! 445:
! 446: /* XXX XXX XXX */
! 447: panic("%s not implemented", __S(__C(CHIP,_io_read_8)));
! 448: }
! 449:
! 450: #define CHIP_io_read_multi_N(BYTES,TYPE) \
! 451: void \
! 452: __C(__C(CHIP,_io_read_multi_),BYTES)(v, h, o, a, c) \
! 453: void *v; \
! 454: bus_space_handle_t h; \
! 455: bus_size_t o, c; \
! 456: TYPE *a; \
! 457: { \
! 458: \
! 459: while (c-- > 0) { \
! 460: __C(CHIP,_io_barrier)(v, h, o, sizeof *a, \
! 461: BUS_BARRIER_READ); \
! 462: *a++ = __C(__C(CHIP,_io_read_),BYTES)(v, h, o); \
! 463: } \
! 464: }
! 465: CHIP_io_read_multi_N(1,u_int8_t)
! 466: CHIP_io_read_multi_N(2,u_int16_t)
! 467: CHIP_io_read_multi_N(4,u_int32_t)
! 468: CHIP_io_read_multi_N(8,u_int64_t)
! 469:
! 470: #define CHIP_io_read_region_N(BYTES,TYPE) \
! 471: void \
! 472: __C(__C(CHIP,_io_read_region_),BYTES)(v, h, o, a, c) \
! 473: void *v; \
! 474: bus_space_handle_t h; \
! 475: bus_size_t o, c; \
! 476: TYPE *a; \
! 477: { \
! 478: \
! 479: while (c-- > 0) { \
! 480: *a++ = __C(__C(CHIP,_io_read_),BYTES)(v, h, o); \
! 481: o += sizeof *a; \
! 482: } \
! 483: }
! 484: CHIP_io_read_region_N(1,u_int8_t)
! 485: CHIP_io_read_region_N(2,u_int16_t)
! 486: CHIP_io_read_region_N(4,u_int32_t)
! 487: CHIP_io_read_region_N(8,u_int64_t)
! 488:
! 489: inline void
! 490: __C(CHIP,_io_write_1)(v, ioh, off, val)
! 491: void *v;
! 492: bus_space_handle_t ioh;
! 493: bus_size_t off;
! 494: u_int8_t val;
! 495: {
! 496: bus_addr_t addr;
! 497:
! 498: addr = ioh + off;
! 499: alpha_stb((u_int8_t *)addr, val);
! 500: alpha_mb();
! 501: }
! 502:
! 503: inline void
! 504: __C(CHIP,_io_write_2)(v, ioh, off, val)
! 505: void *v;
! 506: bus_space_handle_t ioh;
! 507: bus_size_t off;
! 508: u_int16_t val;
! 509: {
! 510: bus_addr_t addr;
! 511:
! 512: addr = ioh + off;
! 513: #ifdef DIAGNOSTIC
! 514: if (addr & 1)
! 515: panic(__S(__C(CHIP,_io_write_2)) ": addr 0x%lx not aligned",
! 516: addr);
! 517: #endif
! 518: alpha_stw((u_int16_t *)addr, val);
! 519: alpha_mb();
! 520: }
! 521:
! 522: inline void
! 523: __C(CHIP,_io_write_4)(v, ioh, off, val)
! 524: void *v;
! 525: bus_space_handle_t ioh;
! 526: bus_size_t off;
! 527: u_int32_t val;
! 528: {
! 529: bus_addr_t addr;
! 530:
! 531: addr = ioh + off;
! 532: #ifdef DIAGNOSTIC
! 533: if (addr & 3)
! 534: panic(__S(__C(CHIP,_io_write_4)) ": addr 0x%lx not aligned",
! 535: addr);
! 536: #endif
! 537: *(u_int32_t *)addr = val;
! 538: alpha_mb();
! 539: }
! 540:
! 541: inline void
! 542: __C(CHIP,_io_write_8)(v, ioh, off, val)
! 543: void *v;
! 544: bus_space_handle_t ioh;
! 545: bus_size_t off;
! 546: u_int64_t val;
! 547: {
! 548:
! 549: /* XXX XXX XXX */
! 550: panic("%s not implemented", __S(__C(CHIP,_io_write_8)));
! 551: alpha_mb();
! 552: }
! 553:
! 554: #define CHIP_io_write_multi_N(BYTES,TYPE) \
! 555: void \
! 556: __C(__C(CHIP,_io_write_multi_),BYTES)(v, h, o, a, c) \
! 557: void *v; \
! 558: bus_space_handle_t h; \
! 559: bus_size_t o, c; \
! 560: const TYPE *a; \
! 561: { \
! 562: \
! 563: while (c-- > 0) { \
! 564: __C(__C(CHIP,_io_write_),BYTES)(v, h, o, *a++); \
! 565: __C(CHIP,_io_barrier)(v, h, o, sizeof *a, \
! 566: BUS_BARRIER_WRITE); \
! 567: } \
! 568: }
! 569: CHIP_io_write_multi_N(1,u_int8_t)
! 570: CHIP_io_write_multi_N(2,u_int16_t)
! 571: CHIP_io_write_multi_N(4,u_int32_t)
! 572: CHIP_io_write_multi_N(8,u_int64_t)
! 573:
! 574: #define CHIP_io_write_region_N(BYTES,TYPE) \
! 575: void \
! 576: __C(__C(CHIP,_io_write_region_),BYTES)(v, h, o, a, c) \
! 577: void *v; \
! 578: bus_space_handle_t h; \
! 579: bus_size_t o, c; \
! 580: const TYPE *a; \
! 581: { \
! 582: \
! 583: while (c-- > 0) { \
! 584: __C(__C(CHIP,_io_write_),BYTES)(v, h, o, *a++); \
! 585: o += sizeof *a; \
! 586: } \
! 587: }
! 588: CHIP_io_write_region_N(1,u_int8_t)
! 589: CHIP_io_write_region_N(2,u_int16_t)
! 590: CHIP_io_write_region_N(4,u_int32_t)
! 591: CHIP_io_write_region_N(8,u_int64_t)
! 592:
! 593: #define CHIP_io_set_multi_N(BYTES,TYPE) \
! 594: void \
! 595: __C(__C(CHIP,_io_set_multi_),BYTES)(v, h, o, val, c) \
! 596: void *v; \
! 597: bus_space_handle_t h; \
! 598: bus_size_t o, c; \
! 599: TYPE val; \
! 600: { \
! 601: \
! 602: while (c-- > 0) { \
! 603: __C(__C(CHIP,_io_write_),BYTES)(v, h, o, val); \
! 604: __C(CHIP,_io_barrier)(v, h, o, sizeof val, \
! 605: BUS_BARRIER_WRITE); \
! 606: } \
! 607: }
! 608: CHIP_io_set_multi_N(1,u_int8_t)
! 609: CHIP_io_set_multi_N(2,u_int16_t)
! 610: CHIP_io_set_multi_N(4,u_int32_t)
! 611: CHIP_io_set_multi_N(8,u_int64_t)
! 612:
! 613: #define CHIP_io_set_region_N(BYTES,TYPE) \
! 614: void \
! 615: __C(__C(CHIP,_io_set_region_),BYTES)(v, h, o, val, c) \
! 616: void *v; \
! 617: bus_space_handle_t h; \
! 618: bus_size_t o, c; \
! 619: TYPE val; \
! 620: { \
! 621: \
! 622: while (c-- > 0) { \
! 623: __C(__C(CHIP,_io_write_),BYTES)(v, h, o, val); \
! 624: o += sizeof val; \
! 625: } \
! 626: }
! 627: CHIP_io_set_region_N(1,u_int8_t)
! 628: CHIP_io_set_region_N(2,u_int16_t)
! 629: CHIP_io_set_region_N(4,u_int32_t)
! 630: CHIP_io_set_region_N(8,u_int64_t)
! 631:
! 632: #define CHIP_io_copy_N(BYTES) \
! 633: void \
! 634: __C(__C(CHIP,_io_copy_),BYTES)(v, h1, o1, h2, o2, c) \
! 635: void *v; \
! 636: bus_space_handle_t h1, h2; \
! 637: bus_size_t o1, o2, c; \
! 638: { \
! 639: bus_size_t i, o; \
! 640: \
! 641: for (i = 0, o = 0; i < c; i++, o += BYTES) \
! 642: __C(__C(CHIP,_io_write_),BYTES)(v, h2, o2 + o, \
! 643: __C(__C(CHIP,_io_read_),BYTES)(v, h1, o1 + o)); \
! 644: }
! 645: CHIP_io_copy_N(1)
! 646: CHIP_io_copy_N(2)
! 647: CHIP_io_copy_N(4)
! 648: CHIP_io_copy_N(8)
! 649:
! 650: #define CHIP_io_read_raw_multi_N(BYTES,TYPE) \
! 651: void \
! 652: __C(__C(CHIP,_io_read_raw_multi_),BYTES)(v, h, o, a, c) \
! 653: void *v; \
! 654: bus_space_handle_t h; \
! 655: bus_size_t o, c; \
! 656: u_int8_t *a; \
! 657: { \
! 658: TYPE temp; \
! 659: int i; \
! 660: \
! 661: while (c > 0) { \
! 662: __C(CHIP,_io_barrier)(v, h, o, BYTES, BUS_BARRIER_READ); \
! 663: temp = __C(__C(CHIP,_io_read_),BYTES)(v, h, o); \
! 664: i = MIN(c, BYTES); \
! 665: c -= i; \
! 666: while (i--) { \
! 667: *a++ = temp & 0xff; \
! 668: temp >>= 8; \
! 669: } \
! 670: } \
! 671: }
! 672: CHIP_io_read_raw_multi_N(2,u_int16_t)
! 673: CHIP_io_read_raw_multi_N(4,u_int32_t)
! 674: CHIP_io_read_raw_multi_N(8,u_int64_t)
! 675:
! 676: #define CHIP_io_write_raw_multi_N(BYTES,TYPE) \
! 677: void \
! 678: __C(__C(CHIP,_io_write_raw_multi_),BYTES)(v, h, o, a, c) \
! 679: void *v; \
! 680: bus_space_handle_t h; \
! 681: bus_size_t o, c; \
! 682: const u_int8_t *a; \
! 683: { \
! 684: TYPE temp; \
! 685: int i; \
! 686: \
! 687: while (c > 0) { \
! 688: temp = 0; \
! 689: for (i = BYTES - 1; i >= 0; i--) { \
! 690: temp <<= 8; \
! 691: if (i < c) \
! 692: temp |= *(a + i); \
! 693: } \
! 694: __C(__C(CHIP,_io_write_),BYTES)(v, h, o, temp); \
! 695: __C(CHIP,_io_barrier)(v, h, o, BYTES, BUS_BARRIER_WRITE); \
! 696: i = MIN(c, BYTES); \
! 697: c -= i; \
! 698: a += i; \
! 699: } \
! 700: }
! 701: CHIP_io_write_raw_multi_N(2,u_int16_t)
! 702: CHIP_io_write_raw_multi_N(4,u_int32_t)
! 703: CHIP_io_write_raw_multi_N(8,u_int64_t)
CVSweb