1 /* $NetBSD: mainbus.c,v 1.10 2009/03/08 05:25:31 tsutsui Exp $ */ 2 3 /*- 4 * Copyright (c) 1998 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Leo Weppelman. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #include <sys/cdefs.h> 33 __KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.10 2009/03/08 05:25:31 tsutsui Exp $"); 34 35 #include <sys/types.h> 36 #include <sys/param.h> 37 #include <sys/systm.h> 38 #include <sys/malloc.h> 39 #include <machine/cpu.h> 40 #include <machine/bus.h> 41 42 static int mb_bus_space_peek_1(bus_space_tag_t, 43 bus_space_handle_t, bus_size_t); 44 static int mb_bus_space_peek_2(bus_space_tag_t, 45 bus_space_handle_t, bus_size_t); 46 static int mb_bus_space_peek_4(bus_space_tag_t, 47 bus_space_handle_t, bus_size_t); 48 static int mb_bus_space_peek_8(bus_space_tag_t, 49 bus_space_handle_t, bus_size_t); 50 static uint8_t mb_bus_space_read_1(bus_space_tag_t, 51 bus_space_handle_t, bus_size_t); 52 static uint16_t mb_bus_space_read_2(bus_space_tag_t, 53 bus_space_handle_t, bus_size_t); 54 static uint32_t mb_bus_space_read_4(bus_space_tag_t, 55 bus_space_handle_t, bus_size_t); 56 static uint64_t mb_bus_space_read_8(bus_space_tag_t, 57 bus_space_handle_t, bus_size_t); 58 static void mb_bus_space_write_1(bus_space_tag_t, 59 bus_space_handle_t, bus_size_t, uint8_t); 60 static void mb_bus_space_write_2(bus_space_tag_t, 61 bus_space_handle_t, bus_size_t, uint16_t); 62 static void mb_bus_space_write_4(bus_space_tag_t, 63 bus_space_handle_t, bus_size_t, uint32_t); 64 static void mb_bus_space_write_8(bus_space_tag_t, 65 bus_space_handle_t, bus_size_t, uint64_t); 66 static void mb_bus_space_read_multi_1(bus_space_tag_t, 67 bus_space_handle_t, bus_size_t, uint8_t *, 68 bus_size_t); 69 static void mb_bus_space_read_multi_2(bus_space_tag_t, 70 bus_space_handle_t, bus_size_t, uint16_t *, 71 bus_size_t); 72 static void mb_bus_space_read_multi_4(bus_space_tag_t, 73 bus_space_handle_t, bus_size_t, uint32_t *, 74 bus_size_t); 75 static void mb_bus_space_read_multi_8(bus_space_tag_t, 76 bus_space_handle_t, bus_size_t, uint64_t *, 77 bus_size_t); 78 static void mb_bus_space_write_multi_1(bus_space_tag_t, 79 bus_space_handle_t, bus_size_t, 80 const uint8_t *, bus_size_t); 81 static void mb_bus_space_write_multi_2(bus_space_tag_t, 82 bus_space_handle_t, bus_size_t, 83 const uint16_t *, bus_size_t); 84 static void mb_bus_space_write_multi_4(bus_space_tag_t, 85 bus_space_handle_t, bus_size_t, 86 const uint32_t *, bus_size_t); 87 static void mb_bus_space_write_multi_8(bus_space_tag_t, 88 bus_space_handle_t, bus_size_t, 89 const uint64_t *, bus_size_t); 90 static void mb_bus_space_read_region_1(bus_space_tag_t, 91 bus_space_handle_t, bus_size_t, uint8_t *, 92 bus_size_t); 93 static void mb_bus_space_read_region_2(bus_space_tag_t, 94 bus_space_handle_t, bus_size_t, uint16_t *, 95 bus_size_t); 96 static void mb_bus_space_read_region_4(bus_space_tag_t, 97 bus_space_handle_t, bus_size_t, uint32_t *, 98 bus_size_t); 99 static void mb_bus_space_read_region_8(bus_space_tag_t, 100 bus_space_handle_t, bus_size_t, uint64_t *, 101 bus_size_t); 102 static void mb_bus_space_write_region_1(bus_space_tag_t, 103 bus_space_handle_t, bus_size_t, 104 const uint8_t *, bus_size_t); 105 static void mb_bus_space_write_region_2(bus_space_tag_t, 106 bus_space_handle_t, bus_size_t, 107 const uint16_t *, bus_size_t); 108 static void mb_bus_space_write_region_4(bus_space_tag_t, 109 bus_space_handle_t, bus_size_t, 110 const uint32_t *, bus_size_t); 111 static void mb_bus_space_write_region_8(bus_space_tag_t, 112 bus_space_handle_t, bus_size_t, 113 const uint64_t *, bus_size_t); 114 static void mb_bus_space_set_multi_1(bus_space_tag_t, 115 bus_space_handle_t, bus_size_t, uint8_t, 116 bus_size_t); 117 static void mb_bus_space_set_multi_2(bus_space_tag_t, 118 bus_space_handle_t, bus_size_t, uint16_t, 119 bus_size_t); 120 static void mb_bus_space_set_multi_4(bus_space_tag_t, 121 bus_space_handle_t, bus_size_t, uint32_t, 122 bus_size_t); 123 static void mb_bus_space_set_multi_8(bus_space_tag_t, 124 bus_space_handle_t, bus_size_t, uint64_t, 125 bus_size_t); 126 static void mb_bus_space_set_region_1(bus_space_tag_t, 127 bus_space_handle_t, bus_size_t, uint8_t, 128 bus_size_t); 129 static void mb_bus_space_set_region_2(bus_space_tag_t, 130 bus_space_handle_t, bus_size_t, uint16_t, 131 bus_size_t); 132 static void mb_bus_space_set_region_4(bus_space_tag_t, 133 bus_space_handle_t, bus_size_t, uint32_t, 134 bus_size_t); 135 static void mb_bus_space_set_region_8(bus_space_tag_t, 136 bus_space_handle_t, bus_size_t, uint64_t, 137 bus_size_t); 138 /* 139 * Calculate offset on the mainbus given a stride_shift and width_offset 140 */ 141 #define calc_addr(base, off, stride, wm) \ 142 ((u_long)(base) + ((off) << (stride)) + (wm)) 143 144 #define __read_1(t, h, o) \ 145 (*((volatile uint8_t *)(calc_addr(h, o, (t)->stride, (t)->wo_1)))) 146 #define __read_2(t, h, o) \ 147 (*((volatile uint16_t *)(calc_addr(h, o, (t)->stride, (t)->wo_2)))) 148 #define __read_4(t, h, o) \ 149 (*((volatile uint32_t *)(calc_addr(h, o, (t)->stride, (t)->wo_4)))) 150 #define __read_8(t, h, o) \ 151 (*((volatile uint64_t *)(calc_addr(h, o, (t)->stride, (t)->wo_8)))) 152 153 #define __write_1(t, h, o, v) \ 154 *((volatile uint8_t *)(calc_addr(h, o, (t)->stride, (t)->wo_1))) = v 155 156 #define __write_2(t, h, o, v) \ 157 *((volatile uint16_t *)(calc_addr(h, o, (t)->stride, (t)->wo_2))) = v 158 159 #define __write_4(t, h, o, v) \ 160 *((volatile uint32_t *)(calc_addr(h, o, (t)->stride, (t)->wo_4))) = v 161 162 #define __write_8(t, h, o, v) \ 163 *((volatile uint64_t *)(calc_addr(h, o, (t)->stride, (t)->wo_8))) = v 164 165 bus_space_tag_t 166 mb_alloc_bus_space_tag(void) 167 { 168 bus_space_tag_t mb_t; 169 170 /* Not really M_TEMP, is it.. */ 171 mb_t = malloc(sizeof(*mb_t), M_TEMP, M_NOWAIT|M_ZERO); 172 if (mb_t == NULL) 173 return NULL; 174 175 mb_t->abs_p_1 = mb_bus_space_peek_1; 176 mb_t->abs_p_2 = mb_bus_space_peek_2; 177 mb_t->abs_p_4 = mb_bus_space_peek_4; 178 mb_t->abs_p_8 = mb_bus_space_peek_8; 179 mb_t->abs_r_1 = mb_bus_space_read_1; 180 mb_t->abs_r_2 = mb_bus_space_read_2; 181 mb_t->abs_r_4 = mb_bus_space_read_4; 182 mb_t->abs_r_8 = mb_bus_space_read_8; 183 mb_t->abs_rs_1 = mb_bus_space_read_1; 184 mb_t->abs_rs_2 = mb_bus_space_read_2; 185 mb_t->abs_rs_4 = mb_bus_space_read_4; 186 mb_t->abs_rs_8 = mb_bus_space_read_8; 187 mb_t->abs_rm_1 = mb_bus_space_read_multi_1; 188 mb_t->abs_rm_2 = mb_bus_space_read_multi_2; 189 mb_t->abs_rm_4 = mb_bus_space_read_multi_4; 190 mb_t->abs_rm_8 = mb_bus_space_read_multi_8; 191 mb_t->abs_rms_1 = mb_bus_space_read_multi_1; 192 mb_t->abs_rms_2 = mb_bus_space_read_multi_2; 193 mb_t->abs_rms_4 = mb_bus_space_read_multi_4; 194 mb_t->abs_rms_8 = mb_bus_space_read_multi_8; 195 mb_t->abs_rr_1 = mb_bus_space_read_region_1; 196 mb_t->abs_rr_2 = mb_bus_space_read_region_2; 197 mb_t->abs_rr_4 = mb_bus_space_read_region_4; 198 mb_t->abs_rr_8 = mb_bus_space_read_region_8; 199 mb_t->abs_rrs_1 = mb_bus_space_read_region_1; 200 mb_t->abs_rrs_2 = mb_bus_space_read_region_2; 201 mb_t->abs_rrs_4 = mb_bus_space_read_region_4; 202 mb_t->abs_rrs_8 = mb_bus_space_read_region_8; 203 mb_t->abs_w_1 = mb_bus_space_write_1; 204 mb_t->abs_w_2 = mb_bus_space_write_2; 205 mb_t->abs_w_4 = mb_bus_space_write_4; 206 mb_t->abs_w_8 = mb_bus_space_write_8; 207 mb_t->abs_ws_1 = mb_bus_space_write_1; 208 mb_t->abs_ws_2 = mb_bus_space_write_2; 209 mb_t->abs_ws_4 = mb_bus_space_write_4; 210 mb_t->abs_ws_8 = mb_bus_space_write_8; 211 mb_t->abs_wm_1 = mb_bus_space_write_multi_1; 212 mb_t->abs_wm_2 = mb_bus_space_write_multi_2; 213 mb_t->abs_wm_4 = mb_bus_space_write_multi_4; 214 mb_t->abs_wm_8 = mb_bus_space_write_multi_8; 215 mb_t->abs_wms_1 = mb_bus_space_write_multi_1; 216 mb_t->abs_wms_2 = mb_bus_space_write_multi_2; 217 mb_t->abs_wms_4 = mb_bus_space_write_multi_4; 218 mb_t->abs_wms_8 = mb_bus_space_write_multi_8; 219 mb_t->abs_wr_1 = mb_bus_space_write_region_1; 220 mb_t->abs_wr_2 = mb_bus_space_write_region_2; 221 mb_t->abs_wr_4 = mb_bus_space_write_region_4; 222 mb_t->abs_wr_8 = mb_bus_space_write_region_8; 223 mb_t->abs_wrs_1 = mb_bus_space_write_region_1; 224 mb_t->abs_wrs_2 = mb_bus_space_write_region_2; 225 mb_t->abs_wrs_4 = mb_bus_space_write_region_4; 226 mb_t->abs_wrs_8 = mb_bus_space_write_region_8; 227 mb_t->abs_sm_1 = mb_bus_space_set_multi_1; 228 mb_t->abs_sm_2 = mb_bus_space_set_multi_2; 229 mb_t->abs_sm_4 = mb_bus_space_set_multi_4; 230 mb_t->abs_sm_8 = mb_bus_space_set_multi_8; 231 mb_t->abs_sr_1 = mb_bus_space_set_region_1; 232 mb_t->abs_sr_2 = mb_bus_space_set_region_2; 233 mb_t->abs_sr_4 = mb_bus_space_set_region_4; 234 mb_t->abs_sr_8 = mb_bus_space_set_region_8; 235 236 return mb_t; 237 } 238 239 void 240 mb_free_bus_space_tag(bus_space_tag_t mb_t) 241 { 242 243 /* Not really M_TEMP, is it.. */ 244 free(mb_t, M_TEMP); 245 } 246 247 static int 248 mb_bus_space_peek_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 249 { 250 251 return !badbaddr((void *)(calc_addr(h, o, t->stride, t->wo_1)), 1); 252 } 253 254 static int 255 mb_bus_space_peek_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 256 { 257 258 return !badbaddr((void *)(calc_addr(h, o, t->stride, t->wo_2)), 2); 259 } 260 261 static int 262 mb_bus_space_peek_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 263 { 264 265 return !badbaddr((void *)(calc_addr(h, o, t->stride, t->wo_4)), 4); 266 } 267 268 static int 269 mb_bus_space_peek_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 270 { 271 272 return !badbaddr((void *)(calc_addr(h, o, t->stride, t->wo_8)), 8); 273 } 274 275 static uint8_t 276 mb_bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 277 { 278 279 return __read_1(t, h, o); 280 } 281 282 static uint16_t 283 mb_bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 284 { 285 286 return __read_2(t, h, o); 287 } 288 289 static uint32_t 290 mb_bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 291 { 292 293 return __read_4(t, h, o); 294 } 295 296 static uint64_t 297 mb_bus_space_read_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 298 { 299 300 return __read_8(t, h, o); 301 } 302 303 static void 304 mb_bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 305 uint8_t v) 306 { 307 308 __write_1(t, h, o, v); 309 } 310 311 static void 312 mb_bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 313 uint16_t v) 314 { 315 316 __write_2(t, h, o, v); 317 } 318 319 static void 320 mb_bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 321 uint32_t v) 322 { 323 324 __write_4(t, h, o, v); 325 } 326 327 static void 328 mb_bus_space_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 329 uint64_t v) 330 { 331 332 __write_8(t, h, o, v); 333 } 334 335 336 static void 337 mb_bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, 338 bus_size_t o, uint8_t *a, bus_size_t c) 339 { 340 volatile uint8_t *ba; 341 342 ba = (volatile uint8_t *)calc_addr(h, o, t->stride, t->wo_1); 343 for (; c; a++, c--) 344 *a = *ba; 345 } 346 347 static void 348 mb_bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, 349 bus_size_t o, uint16_t *a, bus_size_t c) 350 { 351 volatile uint16_t *ba; 352 353 ba = (volatile uint16_t *)calc_addr(h, o, t->stride, t->wo_2); 354 for (; c; a++, c--) 355 *a = *ba; 356 } 357 358 static void 359 mb_bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, 360 bus_size_t o, uint32_t *a, bus_size_t c) 361 { 362 volatile uint32_t *ba; 363 364 ba = (volatile uint32_t *)calc_addr(h, o, t->stride, t->wo_4); 365 for (; c; a++, c--) 366 *a = *ba; 367 } 368 369 static void 370 mb_bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h, 371 bus_size_t o, uint64_t *a, bus_size_t c) 372 { 373 volatile uint64_t *ba; 374 375 ba = (volatile uint64_t *)calc_addr(h, o, t->stride, t->wo_8); 376 for (; c; a++, c--) 377 *a = *ba; 378 } 379 380 static void 381 mb_bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, 382 bus_size_t o, const uint8_t *a, bus_size_t c) 383 { 384 volatile uint8_t *ba; 385 386 ba = (volatile uint8_t *)calc_addr(h, o, t->stride, t->wo_1); 387 for (; c; a++, c--) 388 *ba = *a; 389 } 390 391 static void 392 mb_bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, 393 bus_size_t o, const uint16_t *a, bus_size_t c) 394 { 395 volatile uint16_t *ba; 396 397 ba = (volatile uint16_t *)calc_addr(h, o, t->stride, t->wo_2); 398 for (; c; a++, c--) 399 *ba = *a; 400 } 401 402 static void 403 mb_bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, 404 bus_size_t o, const uint32_t *a, bus_size_t c) 405 { 406 volatile uint32_t *ba; 407 408 ba = (volatile uint32_t *)calc_addr(h, o, t->stride, t->wo_4); 409 for (; c; a++, c--) 410 *ba = *a; 411 } 412 413 static void 414 mb_bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, 415 bus_size_t o, const uint64_t *a, bus_size_t c) 416 { 417 volatile uint64_t *ba; 418 419 ba = (volatile uint64_t *)calc_addr(h, o, t->stride, t->wo_8); 420 for (; c; a++, c--) 421 *ba = *a; 422 } 423 424 /* 425 * void bus_space_read_region_N(bus_space_tag_t tag, 426 * bus_space_handle_t bsh, bus_size_t offset, 427 * uintN_t *addr, size_t count); 428 * 429 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 430 * described by tag/handle and starting at `offset' and copy into 431 * buffer provided. 432 */ 433 static void 434 mb_bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, 435 bus_size_t o, uint8_t *a, bus_size_t c) 436 { 437 438 for (; c; a++, o++, c--) 439 *a = __read_1(t, h, o); 440 } 441 442 static void 443 mb_bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, 444 bus_size_t o, uint16_t *a, bus_size_t c) 445 { 446 447 for (; c; a++, o += 2, c--) 448 *a = __read_2(t, h, o); 449 } 450 451 static void 452 mb_bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, 453 bus_size_t o, uint32_t *a, bus_size_t c) 454 { 455 456 for (; c; a++, o += 4, c--) 457 *a = __read_4(t, h, o); 458 } 459 460 static void 461 mb_bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, 462 bus_size_t o, uint64_t *a, bus_size_t c) 463 { 464 465 for (; c; a++, o += 8, c--) 466 *a = __read_8(t, h, o); 467 } 468 469 /* 470 * void bus_space_write_region_N(bus_space_tag_t tag, 471 * bus_space_handle_t bsh, bus_size_t offset, 472 * uintN_t *addr, size_t count); 473 * 474 * Copy `count' 1, 2, 4, or 8 byte quantities from the buffer provided 475 * into the bus space described by tag/handle and starting at `offset'. 476 */ 477 static void 478 mb_bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, 479 bus_size_t o, const uint8_t *a, bus_size_t c) 480 { 481 482 for (; c; a++, o++, c--) 483 __write_1(t, h, o, *a); 484 } 485 486 static void 487 mb_bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, 488 bus_size_t o, const uint16_t *a, bus_size_t c) 489 { 490 491 for (; c; a++, o += 2, c--) 492 __write_2(t, h, o, *a); 493 } 494 495 static void 496 mb_bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, 497 bus_size_t o, const uint32_t *a, bus_size_t c) 498 { 499 500 for (; c; a++, o += 4, c--) 501 __write_4(t, h, o, *a); 502 } 503 504 static void 505 mb_bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, 506 bus_size_t o, const uint64_t *a, bus_size_t c) 507 { 508 509 for (; c; a++, o += 8, c--) 510 __write_8(t, h, o, *a); 511 } 512 513 /* 514 * void bus_space_set_multi_N(bus_space_tag_t tag, 515 * bus_space_handle_t bsh, bus_size_t offset, uintN_t val, 516 * size_t count); 517 * 518 * Write the 1, 2, 4, or 8 byte value `val' to bus space described 519 * by tag/handle/offset `count' times. 520 */ 521 522 static void 523 mb_bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, 524 bus_size_t o, uint8_t v, bus_size_t c) 525 { 526 volatile uint8_t *ba; 527 528 ba = (volatile uint8_t *)calc_addr(h, o, t->stride, t->wo_1); 529 for (; c; c--) 530 *ba = v; 531 } 532 533 static void 534 mb_bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, 535 bus_size_t o, uint16_t v, bus_size_t c) 536 { 537 volatile uint16_t *ba; 538 539 ba = (volatile uint16_t *)calc_addr(h, o, t->stride, t->wo_2); 540 for (; c; c--) 541 *ba = v; 542 } 543 544 static void 545 mb_bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, 546 bus_size_t o, uint32_t v, bus_size_t c) 547 { 548 volatile uint32_t *ba; 549 550 ba = (volatile uint32_t *)calc_addr(h, o, t->stride, t->wo_4); 551 for (; c; c--) 552 *ba = v; 553 } 554 555 static void 556 mb_bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, 557 bus_size_t o, uint64_t v, bus_size_t c) 558 { 559 volatile uint64_t *ba; 560 561 ba = (volatile uint64_t *)calc_addr(h, o, t->stride, t->wo_8); 562 for (; c; c--) 563 *ba = v; 564 } 565 566 /* 567 * void bus_space_set_region_N(bus_space_tag_t tag, 568 * bus_space_handle_t bsh, bus_size_t offset, uintN_t val, 569 * size_t count); 570 * 571 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 572 * by tag/handle starting at `offset'. 573 */ 574 static void 575 mb_bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, 576 bus_size_t o, uint8_t v, bus_size_t c) 577 { 578 579 for (; c; o++, c--) 580 __write_1(t, h, o, v); 581 } 582 583 static void 584 mb_bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, 585 bus_size_t o, uint16_t v, bus_size_t c) 586 { 587 588 for (; c; o += 2, c--) 589 __write_2(t, h, o, v); 590 } 591 592 static void 593 mb_bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, 594 bus_size_t o, uint32_t v, bus_size_t c) 595 { 596 597 for (; c; o += 4, c--) 598 __write_4(t, h, o, v); 599 } 600 601 static void 602 mb_bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, 603 bus_size_t o, uint64_t v, bus_size_t c) 604 { 605 606 for (; c; o += 8, c--) 607 __write_8(t, h, o, v); 608 } 609