Annotation of sys/arch/alpha/pci/pci_swiz_bus_mem_chipdep.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: pci_swiz_bus_mem_chipdep.c,v 1.4 2007/03/16 21:22:27 robert Exp $ */
! 2: /* $NetBSD: pcs_bus_mem_common.c,v 1.15 1996/12/02 22:19:36 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_D_MEM_BASE Dense Mem space base to use.
! 38: * CHIP_S_MEM_BASE Sparse Mem space base to use.
! 39: */
! 40:
! 41: #include <sys/extent.h>
! 42:
! 43: #define __C(A,B) __CONCAT(A,B)
! 44: #define __S(S) __STRING(S)
! 45:
! 46: #ifndef CHIP_EXTENT_DNAME
! 47: #define CHIP_EXTENT_DNAME(v) __S(__C(CHIP,_bus_dmem))
! 48: #endif
! 49: #ifndef CHIP_EXTENT_SNAME
! 50: #define CHIP_EXTENT_SNAME(v) __S(__C(CHIP,_bus_smem))
! 51: #endif
! 52:
! 53: #ifndef CHIP_EXTENT_DSTORAGE
! 54: #define CHIP_EXTENT_DSTORAGE(v) __C(CHIP,_dmem_ex_storage)
! 55: static long
! 56: __C(CHIP,_dmem_ex_storage)[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
! 57: #endif
! 58: #ifndef CHIP_EXTENT_SSTORAGE
! 59: #define CHIP_EXTENT_SSTORAGE(v) __C(CHIP,_smem_ex_storage)
! 60: static long
! 61: __C(CHIP,_smem_ex_storage)[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
! 62:
! 63: #endif
! 64:
! 65: /* mapping/unmapping */
! 66: int __C(CHIP,_mem_map)(void *, bus_addr_t, bus_size_t, int,
! 67: bus_space_handle_t *);
! 68: void __C(CHIP,_mem_unmap)(void *, bus_space_handle_t,
! 69: bus_size_t);
! 70: int __C(CHIP,_mem_subregion)(void *, bus_space_handle_t,
! 71: bus_size_t, bus_size_t, bus_space_handle_t *);
! 72:
! 73: /* allocation/deallocation */
! 74: int __C(CHIP,_mem_alloc)(void *, bus_addr_t, bus_addr_t,
! 75: bus_size_t, bus_size_t, bus_addr_t, int, bus_addr_t *,
! 76: bus_space_handle_t *);
! 77: void __C(CHIP,_mem_free)(void *, bus_space_handle_t,
! 78: bus_size_t);
! 79:
! 80: /* barrier */
! 81: inline void __C(CHIP,_mem_barrier)(void *, bus_space_handle_t,
! 82: bus_size_t, bus_size_t, int);
! 83:
! 84: /* read (single) */
! 85: inline u_int8_t __C(CHIP,_mem_read_1)(void *, bus_space_handle_t,
! 86: bus_size_t);
! 87: inline u_int16_t __C(CHIP,_mem_read_2)(void *, bus_space_handle_t,
! 88: bus_size_t);
! 89: inline u_int32_t __C(CHIP,_mem_read_4)(void *, bus_space_handle_t,
! 90: bus_size_t);
! 91: inline u_int64_t __C(CHIP,_mem_read_8)(void *, bus_space_handle_t,
! 92: bus_size_t);
! 93:
! 94: /* read multiple */
! 95: void __C(CHIP,_mem_read_multi_1)(void *, bus_space_handle_t,
! 96: bus_size_t, u_int8_t *, bus_size_t);
! 97: void __C(CHIP,_mem_read_multi_2)(void *, bus_space_handle_t,
! 98: bus_size_t, u_int16_t *, bus_size_t);
! 99: void __C(CHIP,_mem_read_multi_4)(void *, bus_space_handle_t,
! 100: bus_size_t, u_int32_t *, bus_size_t);
! 101: void __C(CHIP,_mem_read_multi_8)(void *, bus_space_handle_t,
! 102: bus_size_t, u_int64_t *, bus_size_t);
! 103:
! 104: /* read region */
! 105: void __C(CHIP,_mem_read_region_1)(void *, bus_space_handle_t,
! 106: bus_size_t, u_int8_t *, bus_size_t);
! 107: void __C(CHIP,_mem_read_region_2)(void *, bus_space_handle_t,
! 108: bus_size_t, u_int16_t *, bus_size_t);
! 109: void __C(CHIP,_mem_read_region_4)(void *, bus_space_handle_t,
! 110: bus_size_t, u_int32_t *, bus_size_t);
! 111: void __C(CHIP,_mem_read_region_8)(void *, bus_space_handle_t,
! 112: bus_size_t, u_int64_t *, bus_size_t);
! 113:
! 114: /* write (single) */
! 115: inline void __C(CHIP,_mem_write_1)(void *, bus_space_handle_t,
! 116: bus_size_t, u_int8_t);
! 117: inline void __C(CHIP,_mem_write_2)(void *, bus_space_handle_t,
! 118: bus_size_t, u_int16_t);
! 119: inline void __C(CHIP,_mem_write_4)(void *, bus_space_handle_t,
! 120: bus_size_t, u_int32_t);
! 121: inline void __C(CHIP,_mem_write_8)(void *, bus_space_handle_t,
! 122: bus_size_t, u_int64_t);
! 123:
! 124: /* write multiple */
! 125: void __C(CHIP,_mem_write_multi_1)(void *, bus_space_handle_t,
! 126: bus_size_t, const u_int8_t *, bus_size_t);
! 127: void __C(CHIP,_mem_write_multi_2)(void *, bus_space_handle_t,
! 128: bus_size_t, const u_int16_t *, bus_size_t);
! 129: void __C(CHIP,_mem_write_multi_4)(void *, bus_space_handle_t,
! 130: bus_size_t, const u_int32_t *, bus_size_t);
! 131: void __C(CHIP,_mem_write_multi_8)(void *, bus_space_handle_t,
! 132: bus_size_t, const u_int64_t *, bus_size_t);
! 133:
! 134: /* write region */
! 135: void __C(CHIP,_mem_write_region_1)(void *, bus_space_handle_t,
! 136: bus_size_t, const u_int8_t *, bus_size_t);
! 137: void __C(CHIP,_mem_write_region_2)(void *, bus_space_handle_t,
! 138: bus_size_t, const u_int16_t *, bus_size_t);
! 139: void __C(CHIP,_mem_write_region_4)(void *, bus_space_handle_t,
! 140: bus_size_t, const u_int32_t *, bus_size_t);
! 141: void __C(CHIP,_mem_write_region_8)(void *, bus_space_handle_t,
! 142: bus_size_t, const u_int64_t *, bus_size_t);
! 143:
! 144: /* set multiple */
! 145: void __C(CHIP,_mem_set_multi_1)(void *, bus_space_handle_t,
! 146: bus_size_t, u_int8_t, bus_size_t);
! 147: void __C(CHIP,_mem_set_multi_2)(void *, bus_space_handle_t,
! 148: bus_size_t, u_int16_t, bus_size_t);
! 149: void __C(CHIP,_mem_set_multi_4)(void *, bus_space_handle_t,
! 150: bus_size_t, u_int32_t, bus_size_t);
! 151: void __C(CHIP,_mem_set_multi_8)(void *, bus_space_handle_t,
! 152: bus_size_t, u_int64_t, bus_size_t);
! 153:
! 154: /* set region */
! 155: void __C(CHIP,_mem_set_region_1)(void *, bus_space_handle_t,
! 156: bus_size_t, u_int8_t, bus_size_t);
! 157: void __C(CHIP,_mem_set_region_2)(void *, bus_space_handle_t,
! 158: bus_size_t, u_int16_t, bus_size_t);
! 159: void __C(CHIP,_mem_set_region_4)(void *, bus_space_handle_t,
! 160: bus_size_t, u_int32_t, bus_size_t);
! 161: void __C(CHIP,_mem_set_region_8)(void *, bus_space_handle_t,
! 162: bus_size_t, u_int64_t, bus_size_t);
! 163:
! 164: /* copy */
! 165: void __C(CHIP,_mem_copy_1)(void *, bus_space_handle_t,
! 166: bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
! 167: void __C(CHIP,_mem_copy_2)(void *, bus_space_handle_t,
! 168: bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
! 169: void __C(CHIP,_mem_copy_4)(void *, bus_space_handle_t,
! 170: bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
! 171: void __C(CHIP,_mem_copy_8)(void *, bus_space_handle_t,
! 172: bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
! 173:
! 174: /* read multiple raw */
! 175: void __C(CHIP,_mem_read_raw_multi_2)(void *,
! 176: bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t);
! 177: void __C(CHIP,_mem_read_raw_multi_4)(void *,
! 178: bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t);
! 179: void __C(CHIP,_mem_read_raw_multi_8)(void *,
! 180: bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t);
! 181:
! 182: /* write multiple raw */
! 183: void __C(CHIP,_mem_write_raw_multi_2)(void *,
! 184: bus_space_handle_t, bus_size_t, const u_int8_t *,
! 185: bus_size_t);
! 186: void __C(CHIP,_mem_write_raw_multi_4)(void *,
! 187: bus_space_handle_t, bus_size_t, const u_int8_t *,
! 188: bus_size_t);
! 189: void __C(CHIP,_mem_write_raw_multi_8)(void *,
! 190: bus_space_handle_t, bus_size_t, const u_int8_t *,
! 191: bus_size_t);
! 192:
! 193: void
! 194: __C(CHIP,_bus_mem_init)(t, v)
! 195: bus_space_tag_t t;
! 196: void *v;
! 197: {
! 198: struct extent *dex, *sex;
! 199:
! 200: /*
! 201: * Initialize the bus space tag.
! 202: */
! 203:
! 204: /* cookie */
! 205: t->abs_cookie = v;
! 206:
! 207: /* mapping/unmapping */
! 208: t->abs_map = __C(CHIP,_mem_map);
! 209: t->abs_unmap = __C(CHIP,_mem_unmap);
! 210: t->abs_subregion = __C(CHIP,_mem_subregion);
! 211:
! 212: /* allocation/deallocation */
! 213: t->abs_alloc = __C(CHIP,_mem_alloc);
! 214: t->abs_free = __C(CHIP,_mem_free);
! 215:
! 216: /* barrier */
! 217: t->abs_barrier = __C(CHIP,_mem_barrier);
! 218:
! 219: /* read (single) */
! 220: t->abs_r_1 = __C(CHIP,_mem_read_1);
! 221: t->abs_r_2 = __C(CHIP,_mem_read_2);
! 222: t->abs_r_4 = __C(CHIP,_mem_read_4);
! 223: t->abs_r_8 = __C(CHIP,_mem_read_8);
! 224:
! 225: /* read multiple */
! 226: t->abs_rm_1 = __C(CHIP,_mem_read_multi_1);
! 227: t->abs_rm_2 = __C(CHIP,_mem_read_multi_2);
! 228: t->abs_rm_4 = __C(CHIP,_mem_read_multi_4);
! 229: t->abs_rm_8 = __C(CHIP,_mem_read_multi_8);
! 230:
! 231: /* read region */
! 232: t->abs_rr_1 = __C(CHIP,_mem_read_region_1);
! 233: t->abs_rr_2 = __C(CHIP,_mem_read_region_2);
! 234: t->abs_rr_4 = __C(CHIP,_mem_read_region_4);
! 235: t->abs_rr_8 = __C(CHIP,_mem_read_region_8);
! 236:
! 237: /* write (single) */
! 238: t->abs_w_1 = __C(CHIP,_mem_write_1);
! 239: t->abs_w_2 = __C(CHIP,_mem_write_2);
! 240: t->abs_w_4 = __C(CHIP,_mem_write_4);
! 241: t->abs_w_8 = __C(CHIP,_mem_write_8);
! 242:
! 243: /* write multiple */
! 244: t->abs_wm_1 = __C(CHIP,_mem_write_multi_1);
! 245: t->abs_wm_2 = __C(CHIP,_mem_write_multi_2);
! 246: t->abs_wm_4 = __C(CHIP,_mem_write_multi_4);
! 247: t->abs_wm_8 = __C(CHIP,_mem_write_multi_8);
! 248:
! 249: /* write region */
! 250: t->abs_wr_1 = __C(CHIP,_mem_write_region_1);
! 251: t->abs_wr_2 = __C(CHIP,_mem_write_region_2);
! 252: t->abs_wr_4 = __C(CHIP,_mem_write_region_4);
! 253: t->abs_wr_8 = __C(CHIP,_mem_write_region_8);
! 254:
! 255: /* set multiple */
! 256: t->abs_sm_1 = __C(CHIP,_mem_set_multi_1);
! 257: t->abs_sm_2 = __C(CHIP,_mem_set_multi_2);
! 258: t->abs_sm_4 = __C(CHIP,_mem_set_multi_4);
! 259: t->abs_sm_8 = __C(CHIP,_mem_set_multi_8);
! 260:
! 261: /* set region */
! 262: t->abs_sr_1 = __C(CHIP,_mem_set_region_1);
! 263: t->abs_sr_2 = __C(CHIP,_mem_set_region_2);
! 264: t->abs_sr_4 = __C(CHIP,_mem_set_region_4);
! 265: t->abs_sr_8 = __C(CHIP,_mem_set_region_8);
! 266:
! 267: /* copy */
! 268: t->abs_c_1 = __C(CHIP,_mem_copy_1);
! 269: t->abs_c_2 = __C(CHIP,_mem_copy_2);
! 270: t->abs_c_4 = __C(CHIP,_mem_copy_4);
! 271: t->abs_c_8 = __C(CHIP,_mem_copy_8);
! 272:
! 273: /* read multiple raw */
! 274: t->abs_rrm_2 = __C(CHIP,_mem_read_raw_multi_2);
! 275: t->abs_rrm_4 = __C(CHIP,_mem_read_raw_multi_4);
! 276: t->abs_rrm_8 = __C(CHIP,_mem_read_raw_multi_8);
! 277:
! 278: /* write multiple raw*/
! 279: t->abs_wrm_2 = __C(CHIP,_mem_write_raw_multi_2);
! 280: t->abs_wrm_4 = __C(CHIP,_mem_write_raw_multi_4);
! 281: t->abs_wrm_8 = __C(CHIP,_mem_write_raw_multi_8);
! 282:
! 283: /* XXX WE WANT EXTENT_NOCOALESCE, BUT WE CAN'T USE IT. XXX */
! 284: dex = extent_create(CHIP_EXTENT_DNAME(v), 0x0UL,
! 285: 0xffffffffffffffffUL, M_DEVBUF,
! 286: (caddr_t)CHIP_EXTENT_DSTORAGE(v),
! 287: sizeof(CHIP_EXTENT_DSTORAGE(v)), EX_NOWAIT);
! 288: extent_alloc_region(dex, 0, 0xffffffffffffffffUL, EX_NOWAIT);
! 289:
! 290: #ifdef CHIP_D_MEM_W1_BUS_START
! 291: #ifdef EXTENT_DEBUG
! 292: printf("dmem: freeing from 0x%lx to 0x%lx\n",
! 293: CHIP_D_MEM_W1_BUS_START(v), CHIP_D_MEM_W1_BUS_END(v));
! 294: #endif
! 295: extent_free(dex, CHIP_D_MEM_W1_BUS_START(v),
! 296: CHIP_D_MEM_W1_BUS_END(v) - CHIP_D_MEM_W1_BUS_START(v) + 1,
! 297: EX_NOWAIT);
! 298: #endif
! 299:
! 300: #ifdef EXTENT_DEBUG
! 301: extent_print(dex);
! 302: #endif
! 303: CHIP_D_MEM_EXTENT(v) = dex;
! 304:
! 305: /* XXX WE WANT EXTENT_NOCOALESCE, BUT WE CAN'T USE IT. XXX */
! 306: sex = extent_create(CHIP_EXTENT_SNAME(v), 0x0UL,
! 307: 0xffffffffffffffffUL, M_DEVBUF,
! 308: (caddr_t)CHIP_EXTENT_SSTORAGE(v),
! 309: sizeof(CHIP_EXTENT_SSTORAGE(v)), EX_NOWAIT);
! 310: extent_alloc_region(sex, 0, 0xffffffffffffffffUL, EX_NOWAIT);
! 311:
! 312: #ifdef CHIP_S_MEM_W1_BUS_START
! 313: #ifdef EXTENT_DEBUG
! 314: printf("smem: freeing from 0x%lx to 0x%lx\n",
! 315: CHIP_S_MEM_W1_BUS_START(v), CHIP_S_MEM_W1_BUS_END(v));
! 316: #endif
! 317: extent_free(sex, CHIP_S_MEM_W1_BUS_START(v),
! 318: CHIP_S_MEM_W1_BUS_END(v) - CHIP_S_MEM_W1_BUS_START(v) + 1,
! 319: EX_NOWAIT);
! 320: #endif
! 321: #ifdef CHIP_S_MEM_W2_BUS_START
! 322: if (CHIP_S_MEM_W2_BUS_START(v) != CHIP_S_MEM_W1_BUS_START(v)) {
! 323: #ifdef EXTENT_DEBUG
! 324: printf("smem: freeing from 0x%lx to 0x%lx\n",
! 325: CHIP_S_MEM_W2_BUS_START(v), CHIP_S_MEM_W2_BUS_END(v));
! 326: #endif
! 327: extent_free(sex, CHIP_S_MEM_W2_BUS_START(v),
! 328: CHIP_S_MEM_W2_BUS_END(v) - CHIP_S_MEM_W2_BUS_START(v) + 1,
! 329: EX_NOWAIT);
! 330: } else {
! 331: #ifdef EXTENT_DEBUG
! 332: printf("smem: window 2 (0x%lx to 0x%lx) overlaps window 1\n",
! 333: CHIP_S_MEM_W2_BUS_START(v), CHIP_S_MEM_W2_BUS_END(v));
! 334: #endif
! 335: }
! 336: #endif
! 337: #ifdef CHIP_S_MEM_W3_BUS_START
! 338: if (CHIP_S_MEM_W3_BUS_START(v) != CHIP_S_MEM_W1_BUS_START(v) &&
! 339: CHIP_S_MEM_W3_BUS_START(v) != CHIP_S_MEM_W2_BUS_START(v)) {
! 340: #ifdef EXTENT_DEBUG
! 341: printf("smem: freeing from 0x%lx to 0x%lx\n",
! 342: CHIP_S_MEM_W3_BUS_START(v), CHIP_S_MEM_W3_BUS_END(v));
! 343: #endif
! 344: extent_free(sex, CHIP_S_MEM_W3_BUS_START(v),
! 345: CHIP_S_MEM_W3_BUS_END(v) - CHIP_S_MEM_W3_BUS_START(v) + 1,
! 346: EX_NOWAIT);
! 347: } else {
! 348: #ifdef EXTENT_DEBUG
! 349: printf("smem: window 2 (0x%lx to 0x%lx) overlaps window 1\n",
! 350: CHIP_S_MEM_W2_BUS_START(v), CHIP_S_MEM_W2_BUS_END(v));
! 351: #endif
! 352: }
! 353: #endif
! 354:
! 355: #ifdef EXTENT_DEBUG
! 356: extent_print(sex);
! 357: #endif
! 358: CHIP_S_MEM_EXTENT(v) = sex;
! 359: }
! 360:
! 361: static int __C(CHIP,_xlate_addr_to_dense_handle)(void *,
! 362: bus_addr_t, bus_space_handle_t *);
! 363: static int __C(CHIP,_xlate_dense_handle_to_addr)(void *,
! 364: bus_space_handle_t, bus_addr_t *);
! 365: static int __C(CHIP,_xlate_addr_to_sparse_handle)(void *,
! 366: bus_addr_t, bus_space_handle_t *);
! 367: static int __C(CHIP,_xlate_sparse_handle_to_addr)(void *,
! 368: bus_space_handle_t, bus_addr_t *);
! 369:
! 370: static int
! 371: __C(CHIP,_xlate_addr_to_dense_handle)(v, memaddr, memhp)
! 372: void *v;
! 373: bus_addr_t memaddr;
! 374: bus_space_handle_t *memhp;
! 375: {
! 376: #ifdef CHIP_D_MEM_W1_BUS_START
! 377: if (memaddr >= CHIP_D_MEM_W1_BUS_START(v) &&
! 378: memaddr <= CHIP_D_MEM_W1_BUS_END(v)) {
! 379: *memhp = ALPHA_PHYS_TO_K0SEG(CHIP_D_MEM_W1_SYS_START(v)) +
! 380: (memaddr - CHIP_D_MEM_W1_BUS_START(v));
! 381: return (1);
! 382: } else
! 383: #endif
! 384: return (0);
! 385: }
! 386:
! 387: static int
! 388: __C(CHIP,_xlate_dense_handle_to_addr)(v, memh, memaddrp)
! 389: void *v;
! 390: bus_space_handle_t memh;
! 391: bus_addr_t *memaddrp;
! 392: {
! 393:
! 394: memh = ALPHA_K0SEG_TO_PHYS(memh);
! 395:
! 396: #ifdef CHIP_D_MEM_W1_BUS_START
! 397: if (memh >= CHIP_D_MEM_W1_SYS_START(v) &&
! 398: memh <= CHIP_D_MEM_W1_SYS_END(v)) {
! 399: *memaddrp = CHIP_D_MEM_W1_BUS_START(v) +
! 400: (memh - CHIP_D_MEM_W1_SYS_START(v));
! 401: return (1);
! 402: } else
! 403: #endif
! 404: return (0);
! 405: }
! 406:
! 407: static int
! 408: __C(CHIP,_xlate_addr_to_sparse_handle)(v, memaddr, memhp)
! 409: void *v;
! 410: bus_addr_t memaddr;
! 411: bus_space_handle_t *memhp;
! 412: {
! 413:
! 414: #ifdef CHIP_S_MEM_W1_BUS_START
! 415: if (memaddr >= CHIP_S_MEM_W1_BUS_START(v) &&
! 416: memaddr <= CHIP_S_MEM_W1_BUS_END(v)) {
! 417: *memhp =
! 418: (ALPHA_PHYS_TO_K0SEG(CHIP_S_MEM_W1_SYS_START(v)) >> 5) +
! 419: (memaddr - CHIP_S_MEM_W1_BUS_START(v));
! 420: return (1);
! 421: } else
! 422: #endif
! 423: #ifdef CHIP_S_MEM_W2_BUS_START
! 424: if (memaddr >= CHIP_S_MEM_W2_BUS_START(v) &&
! 425: memaddr <= CHIP_S_MEM_W2_BUS_END(v)) {
! 426: *memhp =
! 427: (ALPHA_PHYS_TO_K0SEG(CHIP_S_MEM_W2_SYS_START(v)) >> 5) +
! 428: (memaddr - CHIP_S_MEM_W2_BUS_START(v));
! 429: return (1);
! 430: } else
! 431: #endif
! 432: #ifdef CHIP_S_MEM_W3_BUS_START
! 433: if (memaddr >= CHIP_S_MEM_W3_BUS_START(v) &&
! 434: memaddr <= CHIP_S_MEM_W3_BUS_END(v)) {
! 435: *memhp =
! 436: (ALPHA_PHYS_TO_K0SEG(CHIP_S_MEM_W3_SYS_START(v)) >> 5) +
! 437: (memaddr - CHIP_S_MEM_W3_BUS_START(v));
! 438: return (1);
! 439: } else
! 440: #endif
! 441: return (0);
! 442: }
! 443:
! 444: static int
! 445: __C(CHIP,_xlate_sparse_handle_to_addr)(v, memh, memaddrp)
! 446: void *v;
! 447: bus_space_handle_t memh;
! 448: bus_addr_t *memaddrp;
! 449: {
! 450:
! 451: memh = ALPHA_K0SEG_TO_PHYS(memh << 5) >> 5;
! 452:
! 453: #ifdef CHIP_S_MEM_W1_BUS_START
! 454: if ((memh << 5) >= CHIP_S_MEM_W1_SYS_START(v) &&
! 455: (memh << 5) <= CHIP_S_MEM_W1_SYS_END(v)) {
! 456: *memaddrp = CHIP_S_MEM_W1_BUS_START(v) +
! 457: (memh - (CHIP_S_MEM_W1_SYS_START(v) >> 5));
! 458: return (1);
! 459: } else
! 460: #endif
! 461: #ifdef CHIP_S_MEM_W2_BUS_START
! 462: if ((memh << 5) >= CHIP_S_MEM_W2_SYS_START(v) &&
! 463: (memh << 5) <= CHIP_S_MEM_W2_SYS_END(v)) {
! 464: *memaddrp = CHIP_S_MEM_W2_BUS_START(v) +
! 465: (memh - (CHIP_S_MEM_W2_SYS_START(v) >> 5));
! 466: return (1);
! 467: } else
! 468: #endif
! 469: #ifdef CHIP_S_MEM_W3_BUS_START
! 470: if ((memh << 5) >= CHIP_S_MEM_W3_SYS_START(v) &&
! 471: (memh << 5) <= CHIP_S_MEM_W3_SYS_END(v)) {
! 472: *memaddrp = CHIP_S_MEM_W3_BUS_START(v) +
! 473: (memh - (CHIP_S_MEM_W3_SYS_START(v) >> 5));
! 474: return (1);
! 475: } else
! 476: #endif
! 477: return (0);
! 478: }
! 479:
! 480: int
! 481: __C(CHIP,_mem_map)(v, memaddr, memsize, cacheable, memhp)
! 482: void *v;
! 483: bus_addr_t memaddr;
! 484: bus_size_t memsize;
! 485: int cacheable;
! 486: bus_space_handle_t *memhp;
! 487: {
! 488: bus_space_handle_t dh = 0, sh = 0; /* XXX -Wuninitialized */
! 489: int didd, dids, errord, errors, mustd, musts;
! 490:
! 491: mustd = 1;
! 492: musts = (cacheable == 0);
! 493:
! 494: #ifdef EXTENT_DEBUG
! 495: printf("mem: allocating 0x%lx to 0x%lx\n", memaddr,
! 496: memaddr + memsize - 1);
! 497: printf("mem: %s dense, %s sparse\n", mustd ? "need" : "want",
! 498: musts ? "need" : "want");
! 499: #endif
! 500: errord = extent_alloc_region(CHIP_D_MEM_EXTENT(v), memaddr, memsize,
! 501: EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
! 502: didd = (errord == 0);
! 503: errors = extent_alloc_region(CHIP_S_MEM_EXTENT(v), memaddr, memsize,
! 504: EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
! 505: dids = (errors == 0);
! 506:
! 507: #ifdef EXTENT_DEBUG
! 508: if (!didd)
! 509: printf("mem: failed to get dense (%d)\n", errord);
! 510: if (!dids)
! 511: printf("mem: failed to get sparse (%d)\n", errors);
! 512: #endif
! 513:
! 514: if ((mustd && !didd) || (musts && !dids))
! 515: goto bad;
! 516:
! 517: if (didd && !__C(CHIP,_xlate_addr_to_dense_handle)(v, memaddr, &dh)) {
! 518: printf("\n");
! 519: #ifdef CHIP_D_MEM_W1_BUS_START
! 520: printf("%s: window[1]=0x%lx-0x%lx\n", __S(__C(CHIP,_mem_map)),
! 521: CHIP_D_MEM_W1_BUS_START(v), CHIP_D_MEM_W1_BUS_END(v));
! 522: #endif
! 523: panic("%s: don't know how to map %lx cacheable",
! 524: __S(__C(CHIP,_mem_map)), memaddr);
! 525: }
! 526:
! 527: if (dids && !__C(CHIP,_xlate_addr_to_sparse_handle)(v, memaddr, &sh)) {
! 528: printf("\n");
! 529: #ifdef CHIP_S_MEM_W1_BUS_START
! 530: printf("%s: window[1]=0x%lx-0x%lx\n", __S(__C(CHIP,_mem_map)),
! 531: CHIP_S_MEM_W1_BUS_START(v), CHIP_S_MEM_W1_BUS_END(v));
! 532: #endif
! 533: #ifdef CHIP_S_MEM_W2_BUS_START
! 534: printf("%s: window[2]=0x%lx-0x%lx\n", __S(__C(CHIP,_mem_map)),
! 535: CHIP_S_MEM_W2_BUS_START(v), CHIP_S_MEM_W2_BUS_END(v));
! 536: #endif
! 537: #ifdef CHIP_S_MEM_W3_BUS_START
! 538: printf("%s: window[3]=0x%lx-0x%lx\n", __S(__C(CHIP,_mem_map)),
! 539: CHIP_S_MEM_W3_BUS_START(v), CHIP_S_MEM_W3_BUS_END(v));
! 540: #endif
! 541: panic("%s: don't know how to map %lx non-cacheable",
! 542: __S(__C(CHIP,_mem_map)), memaddr);
! 543: }
! 544:
! 545: if (cacheable)
! 546: *memhp = dh;
! 547: else
! 548: *memhp = sh;
! 549: return (0);
! 550:
! 551: bad:
! 552: #ifdef EXTENT_DEBUG
! 553: printf("mem: failed\n");
! 554: #endif
! 555: if (didd) {
! 556: #ifdef EXTENT_DEBUG
! 557: printf("mem: freeing dense\n");
! 558: #endif
! 559: if (extent_free(CHIP_D_MEM_EXTENT(v), memaddr, memsize,
! 560: EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)) != 0) {
! 561: printf("%s: WARNING: couldn't free dense 0x%lx-0x%lx\n",
! 562: __S(__C(CHIP,_mem_map)), memaddr,
! 563: memaddr + memsize - 1);
! 564: }
! 565: }
! 566: if (dids) {
! 567: #ifdef EXTENT_DEBUG
! 568: printf("mem: freeing sparse\n");
! 569: #endif
! 570: if (extent_free(CHIP_S_MEM_EXTENT(v), memaddr, memsize,
! 571: EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)) != 0) {
! 572: printf("%s: WARNING: couldn't free sparse 0x%lx-0x%lx\n",
! 573: __S(__C(CHIP,_mem_map)), memaddr,
! 574: memaddr + memsize - 1);
! 575: }
! 576: }
! 577:
! 578: #ifdef EXTENT_DEBUG
! 579: extent_print(CHIP_D_MEM_EXTENT(v));
! 580: extent_print(CHIP_S_MEM_EXTENT(v));
! 581: #endif
! 582:
! 583: /*
! 584: * return dense error if we needed it but couldn't get it, else
! 585: * sparse error. The error _has_ to be one of the two...
! 586: */
! 587: return (mustd && !didd ? errord : (musts && !dids ? errors : EINVAL));
! 588: }
! 589:
! 590: void
! 591: __C(CHIP,_mem_unmap)(v, memh, memsize)
! 592: void *v;
! 593: bus_space_handle_t memh;
! 594: bus_size_t memsize;
! 595: {
! 596: bus_addr_t memaddr;
! 597: bus_space_handle_t temph;
! 598: int sparse, haves, haved;
! 599:
! 600: #ifdef EXTENT_DEBUG
! 601: printf("mem: freeing handle 0x%lx for 0x%lx\n", memh, memsize);
! 602: #endif
! 603:
! 604: /*
! 605: * Find out what space we're in.
! 606: */
! 607: sparse = ((memh >> 63) == 0);
! 608:
! 609: /*
! 610: * Find out what address we're in in that space.
! 611: */
! 612: haves = haved = 0;
! 613: if (sparse)
! 614: haves = __C(CHIP,_xlate_sparse_handle_to_addr)(v, memh,
! 615: &memaddr);
! 616: else
! 617: haved = __C(CHIP,_xlate_dense_handle_to_addr)(v, memh,
! 618: &memaddr);
! 619:
! 620: if (!haves && !haved)
! 621: panic("%s: couldn't get addr from %s handle 0x%lx",
! 622: __S(__C(CHIP,_mem_unmap)), sparse ? "sparse" : "dense",
! 623: memh);
! 624:
! 625: /*
! 626: * Find out were/if that address lives in the other space.
! 627: */
! 628: if (sparse)
! 629: haved = __C(CHIP,_xlate_addr_to_dense_handle)(v, memaddr,
! 630: &temph);
! 631: else
! 632: haves = __C(CHIP,_xlate_addr_to_sparse_handle)(v, memaddr,
! 633: &temph);
! 634:
! 635: /*
! 636: * Free any ranges we have.
! 637: */
! 638: #ifdef EXTENT_DEBUG
! 639: printf("mem: it's at 0x%lx (%sdense, %ssparse)\n", memaddr,
! 640: haved ? "" : "not ", haves ? "" : "not ");
! 641: #endif
! 642: if (haved && extent_free(CHIP_D_MEM_EXTENT(v), memaddr, memsize,
! 643: EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)) != 0) {
! 644: printf("%s: WARNING: couldn't free dense 0x%lx-0x%lx\n",
! 645: __S(__C(CHIP,_mem_map)), memaddr,
! 646: memaddr + memsize - 1);
! 647: }
! 648: if (haves && extent_free(CHIP_S_MEM_EXTENT(v), memaddr, memsize,
! 649: EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)) != 0) {
! 650: printf("%s: WARNING: couldn't free sparse 0x%lx-0x%lx\n",
! 651: __S(__C(CHIP,_mem_map)), memaddr,
! 652: memaddr + memsize - 1);
! 653: }
! 654: }
! 655:
! 656: int
! 657: __C(CHIP,_mem_subregion)(v, memh, offset, size, nmemh)
! 658: void *v;
! 659: bus_space_handle_t memh, *nmemh;
! 660: bus_size_t offset, size;
! 661: {
! 662:
! 663: *nmemh = memh + offset;
! 664: return (0);
! 665: }
! 666:
! 667: int
! 668: __C(CHIP,_mem_alloc)(v, rstart, rend, size, align, boundary, cacheable,
! 669: addrp, bshp)
! 670: void *v;
! 671: bus_addr_t rstart, rend, *addrp;
! 672: bus_size_t size, align, boundary;
! 673: int cacheable;
! 674: bus_space_handle_t *bshp;
! 675: {
! 676:
! 677: /* XXX XXX XXX XXX XXX XXX */
! 678: panic("%s not implemented", __S(__C(CHIP,_mem_alloc)));
! 679: }
! 680:
! 681: void
! 682: __C(CHIP,_mem_free)(v, bsh, size)
! 683: void *v;
! 684: bus_space_handle_t bsh;
! 685: bus_size_t size;
! 686: {
! 687:
! 688: /* XXX XXX XXX XXX XXX XXX */
! 689: panic("%s not implemented", __S(__C(CHIP,_mem_free)));
! 690: }
! 691:
! 692: inline void
! 693: __C(CHIP,_mem_barrier)(v, h, o, l, f)
! 694: void *v;
! 695: bus_space_handle_t h;
! 696: bus_size_t o, l;
! 697: int f;
! 698: {
! 699:
! 700: if ((f & BUS_BARRIER_READ) != 0)
! 701: alpha_mb();
! 702: else if ((f & BUS_BARRIER_WRITE) != 0)
! 703: alpha_wmb();
! 704: }
! 705:
! 706: inline u_int8_t
! 707: __C(CHIP,_mem_read_1)(v, memh, off)
! 708: void *v;
! 709: bus_space_handle_t memh;
! 710: bus_size_t off;
! 711: {
! 712: register bus_space_handle_t tmpmemh;
! 713: register u_int32_t *port, val;
! 714: register u_int8_t rval;
! 715: register int offset;
! 716:
! 717: alpha_mb();
! 718:
! 719: if ((memh >> 63) != 0)
! 720: return (*(u_int8_t *)(memh + off));
! 721:
! 722: tmpmemh = memh + off;
! 723: offset = tmpmemh & 3;
! 724: port = (u_int32_t *)((tmpmemh << 5) | (0 << 3));
! 725: val = *port;
! 726: rval = ((val) >> (8 * offset)) & 0xff;
! 727:
! 728: return rval;
! 729: }
! 730:
! 731: inline u_int16_t
! 732: __C(CHIP,_mem_read_2)(v, memh, off)
! 733: void *v;
! 734: bus_space_handle_t memh;
! 735: bus_size_t off;
! 736: {
! 737: register bus_space_handle_t tmpmemh;
! 738: register u_int32_t *port, val;
! 739: register u_int16_t rval;
! 740: register int offset;
! 741:
! 742: alpha_mb();
! 743:
! 744: if ((memh >> 63) != 0)
! 745: return (*(u_int16_t *)(memh + off));
! 746:
! 747: tmpmemh = memh + off;
! 748: offset = tmpmemh & 3;
! 749: port = (u_int32_t *)((tmpmemh << 5) | (1 << 3));
! 750: val = *port;
! 751: rval = ((val) >> (8 * offset)) & 0xffff;
! 752:
! 753: return rval;
! 754: }
! 755:
! 756: inline u_int32_t
! 757: __C(CHIP,_mem_read_4)(v, memh, off)
! 758: void *v;
! 759: bus_space_handle_t memh;
! 760: bus_size_t off;
! 761: {
! 762: register bus_space_handle_t tmpmemh;
! 763: register u_int32_t *port, val;
! 764: register u_int32_t rval;
! 765: register int offset;
! 766:
! 767: alpha_mb();
! 768:
! 769: if ((memh >> 63) != 0)
! 770: return (*(u_int32_t *)(memh + off));
! 771:
! 772: tmpmemh = memh + off;
! 773: offset = tmpmemh & 3;
! 774: port = (u_int32_t *)((tmpmemh << 5) | (3 << 3));
! 775: val = *port;
! 776: #if 0
! 777: rval = ((val) >> (8 * offset)) & 0xffffffff;
! 778: #else
! 779: rval = val;
! 780: #endif
! 781:
! 782: return rval;
! 783: }
! 784:
! 785: inline u_int64_t
! 786: __C(CHIP,_mem_read_8)(v, memh, off)
! 787: void *v;
! 788: bus_space_handle_t memh;
! 789: bus_size_t off;
! 790: {
! 791:
! 792: alpha_mb();
! 793:
! 794: if ((memh >> 63) != 0)
! 795: return (*(u_int64_t *)(memh + off));
! 796:
! 797: /* XXX XXX XXX */
! 798: panic("%s not implemented", __S(__C(CHIP,_mem_read_8)));
! 799: }
! 800:
! 801: #define CHIP_mem_read_multi_N(BYTES,TYPE) \
! 802: void \
! 803: __C(__C(CHIP,_mem_read_multi_),BYTES)(v, h, o, a, c) \
! 804: void *v; \
! 805: bus_space_handle_t h; \
! 806: bus_size_t o, c; \
! 807: TYPE *a; \
! 808: { \
! 809: \
! 810: while (c-- > 0) { \
! 811: __C(CHIP,_mem_barrier)(v, h, o, sizeof *a, \
! 812: BUS_BARRIER_READ); \
! 813: *a++ = __C(__C(CHIP,_mem_read_),BYTES)(v, h, o); \
! 814: } \
! 815: }
! 816: CHIP_mem_read_multi_N(1,u_int8_t)
! 817: CHIP_mem_read_multi_N(2,u_int16_t)
! 818: CHIP_mem_read_multi_N(4,u_int32_t)
! 819: CHIP_mem_read_multi_N(8,u_int64_t)
! 820:
! 821: #define CHIP_mem_read_region_N(BYTES,TYPE) \
! 822: void \
! 823: __C(__C(CHIP,_mem_read_region_),BYTES)(v, h, o, a, c) \
! 824: void *v; \
! 825: bus_space_handle_t h; \
! 826: bus_size_t o, c; \
! 827: TYPE *a; \
! 828: { \
! 829: \
! 830: while (c-- > 0) { \
! 831: *a++ = __C(__C(CHIP,_mem_read_),BYTES)(v, h, o); \
! 832: o += sizeof *a; \
! 833: } \
! 834: }
! 835: CHIP_mem_read_region_N(1,u_int8_t)
! 836: CHIP_mem_read_region_N(2,u_int16_t)
! 837: CHIP_mem_read_region_N(4,u_int32_t)
! 838: CHIP_mem_read_region_N(8,u_int64_t)
! 839:
! 840: inline void
! 841: __C(CHIP,_mem_write_1)(v, memh, off, val)
! 842: void *v;
! 843: bus_space_handle_t memh;
! 844: bus_size_t off;
! 845: u_int8_t val;
! 846: {
! 847: register bus_space_handle_t tmpmemh;
! 848: register u_int32_t *port, nval;
! 849: register int offset;
! 850:
! 851: if ((memh >> 63) != 0)
! 852: (*(u_int8_t *)(memh + off)) = val;
! 853: else {
! 854: tmpmemh = memh + off;
! 855: offset = tmpmemh & 3;
! 856: nval = val << (8 * offset);
! 857: port = (u_int32_t *)((tmpmemh << 5) | (0 << 3));
! 858: *port = nval;
! 859: }
! 860: alpha_mb();
! 861: }
! 862:
! 863: inline void
! 864: __C(CHIP,_mem_write_2)(v, memh, off, val)
! 865: void *v;
! 866: bus_space_handle_t memh;
! 867: bus_size_t off;
! 868: u_int16_t val;
! 869: {
! 870: register bus_space_handle_t tmpmemh;
! 871: register u_int32_t *port, nval;
! 872: register int offset;
! 873:
! 874: if ((memh >> 63) != 0)
! 875: (*(u_int16_t *)(memh + off)) = val;
! 876: else {
! 877: tmpmemh = memh + off;
! 878: offset = tmpmemh & 3;
! 879: nval = val << (8 * offset);
! 880: port = (u_int32_t *)((tmpmemh << 5) | (1 << 3));
! 881: *port = nval;
! 882: }
! 883: alpha_mb();
! 884: }
! 885:
! 886: inline void
! 887: __C(CHIP,_mem_write_4)(v, memh, off, val)
! 888: void *v;
! 889: bus_space_handle_t memh;
! 890: bus_size_t off;
! 891: u_int32_t val;
! 892: {
! 893: register bus_space_handle_t tmpmemh;
! 894: register u_int32_t *port, nval;
! 895: register int offset;
! 896:
! 897: if ((memh >> 63) != 0)
! 898: (*(u_int32_t *)(memh + off)) = val;
! 899: else {
! 900: tmpmemh = memh + off;
! 901: offset = tmpmemh & 3;
! 902: nval = val /*<< (8 * offset)*/;
! 903: port = (u_int32_t *)((tmpmemh << 5) | (3 << 3));
! 904: *port = nval;
! 905: }
! 906: alpha_mb();
! 907: }
! 908:
! 909: inline void
! 910: __C(CHIP,_mem_write_8)(v, memh, off, val)
! 911: void *v;
! 912: bus_space_handle_t memh;
! 913: bus_size_t off;
! 914: u_int64_t val;
! 915: {
! 916:
! 917: if ((memh >> 63) != 0)
! 918: (*(u_int64_t *)(memh + off)) = val;
! 919: else {
! 920: /* XXX XXX XXX */
! 921: panic("%s not implemented",
! 922: __S(__C(CHIP,_mem_write_8)));
! 923: }
! 924: alpha_mb();
! 925: }
! 926:
! 927: #define CHIP_mem_write_multi_N(BYTES,TYPE) \
! 928: void \
! 929: __C(__C(CHIP,_mem_write_multi_),BYTES)(v, h, o, a, c) \
! 930: void *v; \
! 931: bus_space_handle_t h; \
! 932: bus_size_t o, c; \
! 933: const TYPE *a; \
! 934: { \
! 935: \
! 936: while (c-- > 0) { \
! 937: __C(__C(CHIP,_mem_write_),BYTES)(v, h, o, *a++); \
! 938: __C(CHIP,_mem_barrier)(v, h, o, sizeof *a, \
! 939: BUS_BARRIER_WRITE); \
! 940: } \
! 941: }
! 942: CHIP_mem_write_multi_N(1,u_int8_t)
! 943: CHIP_mem_write_multi_N(2,u_int16_t)
! 944: CHIP_mem_write_multi_N(4,u_int32_t)
! 945: CHIP_mem_write_multi_N(8,u_int64_t)
! 946:
! 947: #define CHIP_mem_write_region_N(BYTES,TYPE) \
! 948: void \
! 949: __C(__C(CHIP,_mem_write_region_),BYTES)(v, h, o, a, c) \
! 950: void *v; \
! 951: bus_space_handle_t h; \
! 952: bus_size_t o, c; \
! 953: const TYPE *a; \
! 954: { \
! 955: \
! 956: while (c-- > 0) { \
! 957: __C(__C(CHIP,_mem_write_),BYTES)(v, h, o, *a++); \
! 958: o += sizeof *a; \
! 959: } \
! 960: }
! 961: CHIP_mem_write_region_N(1,u_int8_t)
! 962: CHIP_mem_write_region_N(2,u_int16_t)
! 963: CHIP_mem_write_region_N(4,u_int32_t)
! 964: CHIP_mem_write_region_N(8,u_int64_t)
! 965:
! 966: #define CHIP_mem_set_multi_N(BYTES,TYPE) \
! 967: void \
! 968: __C(__C(CHIP,_mem_set_multi_),BYTES)(v, h, o, val, c) \
! 969: void *v; \
! 970: bus_space_handle_t h; \
! 971: bus_size_t o, c; \
! 972: TYPE val; \
! 973: { \
! 974: \
! 975: while (c-- > 0) { \
! 976: __C(__C(CHIP,_mem_write_),BYTES)(v, h, o, val); \
! 977: __C(CHIP,_mem_barrier)(v, h, o, sizeof val, \
! 978: BUS_BARRIER_WRITE); \
! 979: } \
! 980: }
! 981: CHIP_mem_set_multi_N(1,u_int8_t)
! 982: CHIP_mem_set_multi_N(2,u_int16_t)
! 983: CHIP_mem_set_multi_N(4,u_int32_t)
! 984: CHIP_mem_set_multi_N(8,u_int64_t)
! 985:
! 986: #define CHIP_mem_set_region_N(BYTES,TYPE) \
! 987: void \
! 988: __C(__C(CHIP,_mem_set_region_),BYTES)(v, h, o, val, c) \
! 989: void *v; \
! 990: bus_space_handle_t h; \
! 991: bus_size_t o, c; \
! 992: TYPE val; \
! 993: { \
! 994: \
! 995: while (c-- > 0) { \
! 996: __C(__C(CHIP,_mem_write_),BYTES)(v, h, o, val); \
! 997: o += sizeof val; \
! 998: } \
! 999: }
! 1000: CHIP_mem_set_region_N(1,u_int8_t)
! 1001: CHIP_mem_set_region_N(2,u_int16_t)
! 1002: CHIP_mem_set_region_N(4,u_int32_t)
! 1003: CHIP_mem_set_region_N(8,u_int64_t)
! 1004:
! 1005: #define CHIP_mem_copy_N(BYTES) \
! 1006: void \
! 1007: __C(__C(CHIP,_mem_copy_),BYTES)(v, h1, o1, h2, o2, c) \
! 1008: void *v; \
! 1009: bus_space_handle_t h1, h2; \
! 1010: bus_size_t o1, o2, c; \
! 1011: { \
! 1012: bus_size_t i, o; \
! 1013: \
! 1014: if ((h1 >> 63) != 0 && (h2 >> 63) != 0) { \
! 1015: bcopy((void *)(h1 + o1), (void *)(h2 + o2), c * BYTES); \
! 1016: return; \
! 1017: } \
! 1018: \
! 1019: /* Circumvent a common case of overlapping problems */ \
! 1020: if (h1 == h2 && o2 > o1) \
! 1021: for (i = 0, o = (c - 1) * BYTES; i < c; i++, o -= BYTES)\
! 1022: __C(__C(CHIP,_mem_write_),BYTES)(v, h2, o2 + o, \
! 1023: __C(__C(CHIP,_mem_read_),BYTES)(v, h1, o1 + o));\
! 1024: else \
! 1025: for (i = 0, o = 0; i < c; i++, o += BYTES) \
! 1026: __C(__C(CHIP,_mem_write_),BYTES)(v, h2, o2 + o, \
! 1027: __C(__C(CHIP,_mem_read_),BYTES)(v, h1, o1 + o));\
! 1028: }
! 1029: CHIP_mem_copy_N(1)
! 1030: CHIP_mem_copy_N(2)
! 1031: CHIP_mem_copy_N(4)
! 1032: CHIP_mem_copy_N(8)
! 1033:
! 1034: #define CHIP_mem_read_raw_multi_N(BYTES,TYPE) \
! 1035: void \
! 1036: __C(__C(CHIP,_mem_read_raw_multi_),BYTES)(v, h, o, a, c) \
! 1037: void *v; \
! 1038: bus_space_handle_t h; \
! 1039: bus_size_t o, c; \
! 1040: u_int8_t *a; \
! 1041: { \
! 1042: TYPE temp; \
! 1043: int i; \
! 1044: \
! 1045: while (c > 0) { \
! 1046: __C(CHIP,_mem_barrier)(v, h, o, BYTES, BUS_BARRIER_READ); \
! 1047: temp = __C(__C(CHIP,_mem_read_),BYTES)(v, h, o); \
! 1048: i = MIN(c, BYTES); \
! 1049: c -= i; \
! 1050: while (i--) { \
! 1051: *a++ = temp & 0xff; \
! 1052: temp >>= 8; \
! 1053: } \
! 1054: } \
! 1055: }
! 1056: CHIP_mem_read_raw_multi_N(2,u_int16_t)
! 1057: CHIP_mem_read_raw_multi_N(4,u_int32_t)
! 1058: CHIP_mem_read_raw_multi_N(8,u_int64_t)
! 1059:
! 1060: #define CHIP_mem_write_raw_multi_N(BYTES,TYPE) \
! 1061: void \
! 1062: __C(__C(CHIP,_mem_write_raw_multi_),BYTES)(v, h, o, a, c) \
! 1063: void *v; \
! 1064: bus_space_handle_t h; \
! 1065: bus_size_t o, c; \
! 1066: const u_int8_t *a; \
! 1067: { \
! 1068: TYPE temp; \
! 1069: int i; \
! 1070: \
! 1071: while (c > 0) { \
! 1072: temp = 0; \
! 1073: for (i = BYTES - 1; i >= 0; i--) { \
! 1074: temp <<= 8; \
! 1075: if (i < c) \
! 1076: temp |= *(a + i); \
! 1077: } \
! 1078: __C(__C(CHIP,_mem_write_),BYTES)(v, h, o, temp); \
! 1079: __C(CHIP,_mem_barrier)(v, h, o, BYTES, BUS_BARRIER_WRITE); \
! 1080: i = MIN(c, BYTES); \
! 1081: c -= i; \
! 1082: a += i; \
! 1083: } \
! 1084: }
! 1085: CHIP_mem_write_raw_multi_N(2,u_int16_t)
! 1086: CHIP_mem_write_raw_multi_N(4,u_int32_t)
! 1087: CHIP_mem_write_raw_multi_N(8,u_int64_t)
CVSweb