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