1 /* $NetBSD: be_bus.c,v 1.4 2000/01/19 13:12:54 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 #include <sys/types.h> 39 #include <sys/param.h> 40 #include <sys/systm.h> 41 #include <sys/malloc.h> 42 #include <machine/cpu.h> 43 #include <machine/bus.h> 44 45 /* 46 * This file contains the common functions for using a big endian (linear) 47 * bus on a big endian atari. 48 */ 49 50 /* Autoconf detection stuff */ 51 static int beb_bus_space_peek_1 __P((bus_space_tag_t, 52 bus_space_handle_t, bus_size_t)); 53 static int beb_bus_space_peek_2 __P((bus_space_tag_t, 54 bus_space_handle_t, bus_size_t)); 55 static int beb_bus_space_peek_4 __P((bus_space_tag_t, 56 bus_space_handle_t, bus_size_t)); 57 static int beb_bus_space_peek_8 __P((bus_space_tag_t, 58 bus_space_handle_t, bus_size_t)); 59 60 /* read (single) */ 61 static u_int8_t beb_bus_space_read_1 __P((bus_space_tag_t, 62 bus_space_handle_t, bus_size_t)); 63 static u_int16_t beb_bus_space_read_2 __P((bus_space_tag_t, 64 bus_space_handle_t, bus_size_t)); 65 static u_int32_t beb_bus_space_read_4 __P((bus_space_tag_t, 66 bus_space_handle_t, bus_size_t)); 67 static u_int64_t beb_bus_space_read_8 __P((bus_space_tag_t, 68 bus_space_handle_t, bus_size_t)); 69 70 /* write (single) */ 71 static void beb_bus_space_write_1 __P((bus_space_tag_t, 72 bus_space_handle_t, bus_size_t, u_int8_t)); 73 static void beb_bus_space_write_2 __P((bus_space_tag_t, 74 bus_space_handle_t, bus_size_t, u_int16_t)); 75 static void beb_bus_space_write_4 __P((bus_space_tag_t, 76 bus_space_handle_t, bus_size_t, u_int32_t)); 77 static void beb_bus_space_write_8 __P((bus_space_tag_t, 78 bus_space_handle_t, bus_size_t, u_int64_t)); 79 80 /* read multiple */ 81 static void beb_bus_space_read_multi_1 __P((bus_space_tag_t, 82 bus_space_handle_t, bus_size_t, u_int8_t *, 83 bus_size_t)); 84 static void beb_bus_space_read_multi_2 __P((bus_space_tag_t, 85 bus_space_handle_t, bus_size_t, u_int16_t *, 86 bus_size_t)); 87 static void beb_bus_space_read_multi_4 __P((bus_space_tag_t, 88 bus_space_handle_t, bus_size_t, u_int32_t *, 89 bus_size_t)); 90 static void beb_bus_space_read_multi_8 __P((bus_space_tag_t, 91 bus_space_handle_t, bus_size_t, u_int64_t *, 92 bus_size_t)); 93 94 /* write multiple */ 95 static void beb_bus_space_write_multi_1 __P((bus_space_tag_t, 96 bus_space_handle_t, bus_size_t, 97 const u_int8_t *, bus_size_t)); 98 static void beb_bus_space_write_multi_2 __P((bus_space_tag_t, 99 bus_space_handle_t, bus_size_t, 100 const u_int16_t *, bus_size_t)); 101 static void beb_bus_space_write_multi_4 __P((bus_space_tag_t, 102 bus_space_handle_t, bus_size_t, 103 const u_int32_t *, bus_size_t)); 104 static void beb_bus_space_write_multi_8 __P((bus_space_tag_t, 105 bus_space_handle_t, bus_size_t, 106 const u_int64_t *, bus_size_t)); 107 108 /* read region */ 109 static void beb_bus_space_read_region_1 __P((bus_space_tag_t, 110 bus_space_handle_t, bus_size_t, u_int8_t *, 111 bus_size_t)); 112 static void beb_bus_space_read_region_2 __P((bus_space_tag_t, 113 bus_space_handle_t, bus_size_t, u_int16_t *, 114 bus_size_t)); 115 static void beb_bus_space_read_region_4 __P((bus_space_tag_t, 116 bus_space_handle_t, bus_size_t, u_int32_t *, 117 bus_size_t)); 118 static void beb_bus_space_read_region_8 __P((bus_space_tag_t, 119 bus_space_handle_t, bus_size_t, u_int64_t *, 120 bus_size_t)); 121 122 /* read region */ 123 static void beb_bus_space_write_region_1 __P((bus_space_tag_t, 124 bus_space_handle_t, bus_size_t, 125 const u_int8_t *, bus_size_t)); 126 static void beb_bus_space_write_region_2 __P((bus_space_tag_t, 127 bus_space_handle_t, bus_size_t, 128 const u_int16_t *, bus_size_t)); 129 static void beb_bus_space_write_region_4 __P((bus_space_tag_t, 130 bus_space_handle_t, bus_size_t, 131 const u_int32_t *, bus_size_t)); 132 static void beb_bus_space_write_region_8 __P((bus_space_tag_t, 133 bus_space_handle_t, bus_size_t, 134 const u_int64_t *, bus_size_t)); 135 136 /* set multi */ 137 static void beb_bus_space_set_multi_1 __P((bus_space_tag_t, 138 bus_space_handle_t, bus_size_t, u_int8_t, 139 bus_size_t)); 140 static void beb_bus_space_set_multi_2 __P((bus_space_tag_t, 141 bus_space_handle_t, bus_size_t, u_int16_t, 142 bus_size_t)); 143 static void beb_bus_space_set_multi_4 __P((bus_space_tag_t, 144 bus_space_handle_t, bus_size_t, u_int32_t, 145 bus_size_t)); 146 static void beb_bus_space_set_multi_8 __P((bus_space_tag_t, 147 bus_space_handle_t, bus_size_t, u_int64_t, 148 bus_size_t)); 149 150 /* set region */ 151 static void beb_bus_space_set_region_1 __P((bus_space_tag_t, 152 bus_space_handle_t, bus_size_t, u_int8_t, 153 bus_size_t)); 154 static void beb_bus_space_set_region_2 __P((bus_space_tag_t, 155 bus_space_handle_t, bus_size_t, u_int16_t, 156 bus_size_t)); 157 static void beb_bus_space_set_region_4 __P((bus_space_tag_t, 158 bus_space_handle_t, bus_size_t, u_int32_t, 159 bus_size_t)); 160 static void beb_bus_space_set_region_8 __P((bus_space_tag_t, 161 bus_space_handle_t, bus_size_t, u_int64_t, 162 bus_size_t)); 163 164 /* 165 * Don't force a function call overhead on these primitives... 166 */ 167 #define __read_1(h, o) *((u_int8_t *)((h) + (o))) 168 #define __read_2(h, o) *((u_int16_t *)((h) + (o))) 169 #define __read_4(h, o) *((u_int32_t *)((h) + (o))) 170 #define __read_8(h, o) *((u_int64_t *)((h) + (o))) 171 172 #define __write_1(h, o, v) *((u_int8_t *)((h) + (o))) = (v) 173 #define __write_2(h, o, v) *((u_int16_t *)((h) + (o))) = (v) 174 #define __write_4(h, o, v) *((u_int32_t *)((h) + (o))) = (v) 175 #define __write_8(h, o, v) *((u_int64_t *)((h) + (o))) = (v) 176 177 bus_space_tag_t 178 beb_alloc_bus_space_tag(storage) 179 bus_space_tag_t storage; 180 { 181 bus_space_tag_t beb_t; 182 183 /* 184 * Allow the caller to specify storage space for the tag. This 185 * is used during console config (when malloc() can't be used). 186 */ 187 if (storage != NULL) 188 beb_t = storage; 189 else { 190 if ((beb_t = malloc(sizeof(*beb_t), M_TEMP, M_NOWAIT)) == NULL) 191 return(NULL); 192 } 193 bzero(beb_t, sizeof(*beb_t)); 194 195 beb_t->abs_p_1 = beb_bus_space_peek_1; 196 beb_t->abs_p_2 = beb_bus_space_peek_2; 197 beb_t->abs_p_4 = beb_bus_space_peek_4; 198 beb_t->abs_p_8 = beb_bus_space_peek_8; 199 beb_t->abs_r_1 = beb_bus_space_read_1; 200 beb_t->abs_r_2 = beb_bus_space_read_2; 201 beb_t->abs_r_4 = beb_bus_space_read_4; 202 beb_t->abs_r_8 = beb_bus_space_read_8; 203 beb_t->abs_rs_1 = beb_bus_space_read_1; 204 beb_t->abs_rs_2 = beb_bus_space_read_2; 205 beb_t->abs_rs_4 = beb_bus_space_read_4; 206 beb_t->abs_rs_8 = beb_bus_space_read_8; 207 beb_t->abs_rm_1 = beb_bus_space_read_multi_1; 208 beb_t->abs_rm_2 = beb_bus_space_read_multi_2; 209 beb_t->abs_rm_4 = beb_bus_space_read_multi_4; 210 beb_t->abs_rm_8 = beb_bus_space_read_multi_8; 211 beb_t->abs_rms_1 = beb_bus_space_read_multi_1; 212 beb_t->abs_rms_2 = beb_bus_space_read_multi_2; 213 beb_t->abs_rms_4 = beb_bus_space_read_multi_4; 214 beb_t->abs_rms_8 = beb_bus_space_read_multi_8; 215 beb_t->abs_rr_1 = beb_bus_space_read_region_1; 216 beb_t->abs_rr_2 = beb_bus_space_read_region_2; 217 beb_t->abs_rr_4 = beb_bus_space_read_region_4; 218 beb_t->abs_rr_8 = beb_bus_space_read_region_8; 219 beb_t->abs_rrs_1 = beb_bus_space_read_region_1; 220 beb_t->abs_rrs_2 = beb_bus_space_read_region_2; 221 beb_t->abs_rrs_4 = beb_bus_space_read_region_4; 222 beb_t->abs_rrs_8 = beb_bus_space_read_region_8; 223 beb_t->abs_w_1 = beb_bus_space_write_1; 224 beb_t->abs_w_2 = beb_bus_space_write_2; 225 beb_t->abs_w_4 = beb_bus_space_write_4; 226 beb_t->abs_w_8 = beb_bus_space_write_8; 227 beb_t->abs_ws_1 = beb_bus_space_write_1; 228 beb_t->abs_ws_2 = beb_bus_space_write_2; 229 beb_t->abs_ws_4 = beb_bus_space_write_4; 230 beb_t->abs_ws_8 = beb_bus_space_write_8; 231 beb_t->abs_wm_1 = beb_bus_space_write_multi_1; 232 beb_t->abs_wm_2 = beb_bus_space_write_multi_2; 233 beb_t->abs_wm_4 = beb_bus_space_write_multi_4; 234 beb_t->abs_wm_8 = beb_bus_space_write_multi_8; 235 beb_t->abs_wms_1 = beb_bus_space_write_multi_1; 236 beb_t->abs_wms_2 = beb_bus_space_write_multi_2; 237 beb_t->abs_wms_4 = beb_bus_space_write_multi_4; 238 beb_t->abs_wms_8 = beb_bus_space_write_multi_8; 239 beb_t->abs_wr_1 = beb_bus_space_write_region_1; 240 beb_t->abs_wr_2 = beb_bus_space_write_region_2; 241 beb_t->abs_wr_4 = beb_bus_space_write_region_4; 242 beb_t->abs_wr_8 = beb_bus_space_write_region_8; 243 beb_t->abs_wrs_1 = beb_bus_space_write_region_1; 244 beb_t->abs_wrs_2 = beb_bus_space_write_region_2; 245 beb_t->abs_wrs_4 = beb_bus_space_write_region_4; 246 beb_t->abs_wrs_8 = beb_bus_space_write_region_8; 247 beb_t->abs_sm_1 = beb_bus_space_set_multi_1; 248 beb_t->abs_sm_2 = beb_bus_space_set_multi_2; 249 beb_t->abs_sm_4 = beb_bus_space_set_multi_4; 250 beb_t->abs_sm_8 = beb_bus_space_set_multi_8; 251 beb_t->abs_sr_1 = beb_bus_space_set_region_1; 252 beb_t->abs_sr_2 = beb_bus_space_set_region_2; 253 beb_t->abs_sr_4 = beb_bus_space_set_region_4; 254 beb_t->abs_sr_8 = beb_bus_space_set_region_8; 255 256 return(beb_t); 257 } 258 259 260 /* 261 * The various access functions 262 */ 263 264 /* 265 * int bus_space_peek_N __P((bus_space_tag_t tag, 266 * bus_space_handle_t sh, bus_size_t offset)); 267 * 268 * Check if the address is suitable for reading N-byte quantities. 269 */ 270 static int 271 beb_bus_space_peek_1(t, h, o) 272 bus_space_tag_t t; 273 bus_space_handle_t h; 274 bus_size_t o; 275 { 276 return(!badbaddr((caddr_t)(h + o), 1)); 277 } 278 279 static int 280 beb_bus_space_peek_2(t, h, o) 281 bus_space_tag_t t; 282 bus_space_handle_t h; 283 bus_size_t o; 284 { 285 return(!badbaddr((caddr_t)(h + o), 2)); 286 } 287 288 static int 289 beb_bus_space_peek_4(t, h, o) 290 bus_space_tag_t t; 291 bus_space_handle_t h; 292 bus_size_t o; 293 { 294 return(!badbaddr((caddr_t)(h + o), 4)); 295 } 296 297 static int 298 beb_bus_space_peek_8(t, h, o) 299 bus_space_tag_t t; 300 bus_space_handle_t h; 301 bus_size_t o; 302 { 303 return(!badbaddr((caddr_t)(h + o), 8)); 304 } 305 306 /* 307 * u_intX_t bus_space_read_N __P((bus_space_tag_t tag, 308 * bus_space_handle_t bsh, bus_size_t offset)); 309 * 310 * Return an 1, 2, 4, or 8 byte value read from the bus_space described 311 * by tag/handle at `offset'. The value is converted to host-endian. 312 */ 313 static u_int8_t 314 beb_bus_space_read_1(t, h, o) 315 bus_space_tag_t t; 316 bus_space_handle_t h; 317 bus_size_t o; 318 { 319 return(__read_1(h, o)); 320 } 321 322 static u_int16_t 323 beb_bus_space_read_2(t, h, o) 324 bus_space_tag_t t; 325 bus_space_handle_t h; 326 bus_size_t o; 327 { 328 return(__read_2(h, o)); 329 } 330 331 static u_int32_t 332 beb_bus_space_read_4(t, h, o) 333 bus_space_tag_t t; 334 bus_space_handle_t h; 335 bus_size_t o; 336 { 337 return(__read_4(h, o)); 338 } 339 340 static u_int64_t 341 beb_bus_space_read_8(t, h, o) 342 bus_space_tag_t t; 343 bus_space_handle_t h; 344 bus_size_t o; 345 { 346 return(__read_8(h, o)); 347 } 348 349 /* 350 * u_intX_t bus_space_write_N __P((bus_space_tag_t tag, 351 * bus_space_handle_t bsh, bus_size_t offset, u_intX_t val)); 352 * 353 * Write an 1, 2, 4, or 8 byte value to the bus_space described by tag/handle 354 * at `offset'. The value `val' is converted from host to bus endianness 355 * before being written. 356 */ 357 static void 358 beb_bus_space_write_1(t, h, o, v) 359 bus_space_tag_t t; 360 bus_space_handle_t h; 361 bus_size_t o; 362 u_int8_t v; 363 { 364 __write_1(h, o, v); 365 } 366 367 static void 368 beb_bus_space_write_2(t, h, o, v) 369 bus_space_tag_t t; 370 bus_space_handle_t h; 371 bus_size_t o; 372 u_int16_t v; 373 { 374 __write_2(h, o, v); 375 } 376 377 static void 378 beb_bus_space_write_4(t, h, o, v) 379 bus_space_tag_t t; 380 bus_space_handle_t h; 381 bus_size_t o; 382 u_int32_t v; 383 { 384 __write_4(h, o, v); 385 } 386 387 static void 388 beb_bus_space_write_8(t, h, o, v) 389 bus_space_tag_t t; 390 bus_space_handle_t h; 391 bus_size_t o; 392 u_int64_t v; 393 { 394 __write_8(h, o, v); 395 } 396 397 /* 398 * void bus_space_read_multi_N __P((bus_space_tag_t tag, 399 * bus_space_handle_t bsh, bus_size_t offset, u_intX_t *address, 400 * bus_size_t count)); 401 * 402 * Read 'count' 1, 2, 4, or 8 byte values from the bus_space described by 403 * tag/handle at `offset' and store them in the address range starting at 404 * 'address'. The values are converted to cpu endian order before being 405 * being stored. 406 */ 407 static void 408 beb_bus_space_read_multi_1(t, h, o, a, c) 409 bus_space_tag_t t; 410 bus_space_handle_t h; 411 bus_size_t o, c; 412 u_int8_t *a; 413 { 414 for (; c; a++, c--) 415 *a = __read_1(h, o); 416 } 417 static void 418 beb_bus_space_read_multi_2(t, h, o, a, c) 419 bus_space_tag_t t; 420 bus_space_handle_t h; 421 bus_size_t o, c; 422 u_int16_t *a; 423 { 424 for (; c; a++, c--) 425 *a = __read_2(h, o); 426 } 427 428 static void 429 beb_bus_space_read_multi_4(t, h, o, a, c) 430 bus_space_tag_t t; 431 bus_space_handle_t h; 432 bus_size_t o, c; 433 u_int32_t *a; 434 { 435 for (; c; a++, c--) 436 *a = __read_4(h, o); 437 } 438 439 static void 440 beb_bus_space_read_multi_8(t, h, o, a, c) 441 bus_space_tag_t t; 442 bus_space_handle_t h; 443 bus_size_t o, c; 444 u_int64_t *a; 445 { 446 for (; c; a++, c--) 447 *a = __read_8(h, o); 448 } 449 450 /* 451 * void bus_space_write_multi_N __P((bus_space_tag_t tag, 452 * bus_space_handle_t bsh, bus_size_t offset, 453 * const u_intX_t *address, bus_size_t count)); 454 * 455 * Write 'count' 1, 2, 4, or 8 byte values from the address range starting 456 * at 'address' to the bus_space described by tag/handle at `offset'. 457 * The values are converted to bus endian order before being written to 458 * the bus. 459 */ 460 static void 461 beb_bus_space_write_multi_1(t, h, o, a, c) 462 bus_space_tag_t t; 463 bus_space_handle_t h; 464 bus_size_t o, c; 465 const u_int8_t *a; 466 { 467 for (; c; a++, c--) 468 __write_1(h, o, *a); 469 } 470 471 static void 472 beb_bus_space_write_multi_2(t, h, o, a, c) 473 bus_space_tag_t t; 474 bus_space_handle_t h; 475 bus_size_t o, c; 476 const u_int16_t *a; 477 { 478 for (; c; a++, c--) 479 __write_2(h, o, *a); 480 } 481 482 static void 483 beb_bus_space_write_multi_4(t, h, o, a, c) 484 bus_space_tag_t t; 485 bus_space_handle_t h; 486 bus_size_t o, c; 487 const u_int32_t *a; 488 { 489 for (; c; a++, c--) 490 __write_4(h, o, *a); 491 } 492 493 static void 494 beb_bus_space_write_multi_8(t, h, o, a, c) 495 bus_space_tag_t t; 496 bus_space_handle_t h; 497 bus_size_t o, c; 498 const u_int64_t *a; 499 { 500 for (; c; a++, c--) 501 __write_8(h, o, *a); 502 } 503 504 /* 505 * void bus_space_read_region_N __P((bus_space_tag_t tag, 506 * bus_space_handle_t bsh, bus_size_t offset, 507 * u_intN_t *addr, bus_size_t count)); 508 * 509 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 510 * described by tag/handle and starting at `offset' and copy into 511 * buffer provided. 512 */ 513 static void 514 beb_bus_space_read_region_1(t, h, o, a, c) 515 bus_space_tag_t t; 516 bus_space_handle_t h; 517 bus_size_t o, c; 518 u_int8_t *a; 519 { 520 for (; c; a++, o++, c--) 521 *a = __read_1(h, o); 522 } 523 524 static void 525 beb_bus_space_read_region_2(t, h, o, a, c) 526 bus_space_tag_t t; 527 bus_space_handle_t h; 528 bus_size_t o, c; 529 u_int16_t *a; 530 { 531 for (; c; a++, o += 2, c--) 532 *a = __read_2(h, o); 533 } 534 535 static void 536 beb_bus_space_read_region_4(t, h, o, a, c) 537 bus_space_tag_t t; 538 bus_space_handle_t h; 539 bus_size_t o, c; 540 u_int32_t *a; 541 { 542 for (; c; a++, o += 4, c--) 543 *a = __read_4(h, o); 544 } 545 546 static void 547 beb_bus_space_read_region_8(t, h, o, a, c) 548 bus_space_tag_t t; 549 bus_space_handle_t h; 550 bus_size_t o, c; 551 u_int64_t *a; 552 { 553 for (; c; a++, o += 8, c--) 554 *a = __read_8(h, o); 555 } 556 557 /* 558 * void bus_space_write_region_N __P((bus_space_tag_t tag, 559 * bus_space_handle_t bsh, bus_size_t offset, 560 * u_intN_t *addr, bus_size_t count)); 561 * 562 * Copy `count' 1, 2, 4, or 8 byte quantities from the buffer provided 563 * into the bus space described by tag/handle and starting at `offset'. 564 */ 565 static void 566 beb_bus_space_write_region_1(t, h, o, a, c) 567 bus_space_tag_t t; 568 bus_space_handle_t h; 569 bus_size_t o, c; 570 const u_int8_t *a; 571 { 572 for (; c; a++, o++, c--) 573 __write_1(h, o, *a); 574 } 575 576 static void 577 beb_bus_space_write_region_2(t, h, o, a, c) 578 bus_space_tag_t t; 579 bus_space_handle_t h; 580 bus_size_t o, c; 581 const u_int16_t *a; 582 { 583 for (; c; a++, o += 2, c--) 584 __write_2(h, o, *a); 585 } 586 587 static void 588 beb_bus_space_write_region_4(t, h, o, a, c) 589 bus_space_tag_t t; 590 bus_space_handle_t h; 591 bus_size_t o, c; 592 const u_int32_t *a; 593 { 594 for (; c; a++, o += 4, c--) 595 __write_4(h, o, *a); 596 } 597 598 static void 599 beb_bus_space_write_region_8(t, h, o, a, c) 600 bus_space_tag_t t; 601 bus_space_handle_t h; 602 bus_size_t o, c; 603 const u_int64_t *a; 604 { 605 for (; c; a++, o += 8, c--) 606 __write_8(h, o, *a); 607 } 608 609 /* 610 * void bus_space_set_multi_N __P((bus_space_tag_t tag, 611 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 612 * bus_size_t count)); 613 * 614 * Write the 1, 2, 4, or 8 byte value `val' to bus space described 615 * by tag/handle/offset `count' times. 616 */ 617 618 static void 619 beb_bus_space_set_multi_1(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_int8_t v; 624 { 625 for (; c; c--) 626 __write_1(h, o, v); 627 } 628 629 static void 630 beb_bus_space_set_multi_2(t, h, o, v, c) 631 bus_space_tag_t t; 632 bus_space_handle_t h; 633 bus_size_t o, c; 634 u_int16_t v; 635 { 636 for (; c; c--) 637 __write_2(h, o, v); 638 } 639 640 static void 641 beb_bus_space_set_multi_4(t, h, o, v, c) 642 bus_space_tag_t t; 643 bus_space_handle_t h; 644 bus_size_t o, c; 645 u_int32_t v; 646 { 647 for (; c; c--) 648 __write_4(h, o, v); 649 } 650 651 static void 652 beb_bus_space_set_multi_8(t, h, o, v, c) 653 bus_space_tag_t t; 654 bus_space_handle_t h; 655 bus_size_t o, c; 656 u_int64_t v; 657 { 658 for (; c; c--) 659 __write_8(h, o, v); 660 } 661 662 /* 663 * void bus_space_set_region_N __P((bus_space_tag_t tag, 664 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 665 * bus_size_t count)); 666 * 667 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 668 * by tag/handle starting at `offset'. 669 */ 670 static void 671 beb_bus_space_set_region_1(t, h, o, v, c) 672 bus_space_tag_t t; 673 bus_space_handle_t h; 674 bus_size_t o, c; 675 u_int8_t v; 676 { 677 for (; c; o++, c--) 678 __write_1(h, o, v); 679 } 680 681 static void 682 beb_bus_space_set_region_2(t, h, o, v, c) 683 bus_space_tag_t t; 684 bus_space_handle_t h; 685 bus_size_t o, c; 686 u_int16_t v; 687 { 688 for (; c; o += 2, c--) 689 __write_2(h, o, v); 690 } 691 692 static void 693 beb_bus_space_set_region_4(t, h, o, v, c) 694 bus_space_tag_t t; 695 bus_space_handle_t h; 696 bus_size_t o, c; 697 u_int32_t v; 698 { 699 for (; c; o += 4, c--) 700 __write_4(h, o, v); 701 } 702 703 static void 704 beb_bus_space_set_region_8(t, h, o, v, c) 705 bus_space_tag_t t; 706 bus_space_handle_t h; 707 bus_size_t o, c; 708 u_int64_t v; 709 { 710 for (; c; o += 8, c--) 711 __write_8(h, o, v); 712 } 713