1 /* $NetBSD: bus_space_through.c,v 1.2 2002/04/14 07:59:59 takemura Exp $ */ 2 3 /*- 4 * Copyright (c) 2001 TAKEMRUA Shin. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. Neither the name of the project nor the names of its contributors 15 * may be used to endorse or promote products derived from this software 16 * without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * 30 */ 31 32 #include <sys/systm.h> 33 #include <machine/bus.h> 34 35 bus_space_protos(bs_through); 36 /* 37 * Mapping and unmapping operations. 38 */ 39 int 40 bs_through_bs_map(bus_space_tag_t t, bus_addr_t addr, 41 bus_size_t size, int cacheable, bus_space_handle_t *bshp) 42 { 43 return bus_space_map(t->bs_base, addr, size, cacheable, bshp); 44 } 45 46 void 47 bs_through_bs_unmap(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size) 48 { 49 bus_space_unmap(t->bs_base, bsh, size); 50 } 51 52 int 53 bs_through_bs_subregion(bus_space_tag_t t, bus_space_handle_t bsh, 54 bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp) 55 { 56 return bus_space_subregion(t->bs_base, bsh, offset, size, nbshp); 57 } 58 59 60 /* 61 * Allocation and deallocation operations. 62 */ 63 int 64 bs_through_bs_alloc(bus_space_tag_t t, bus_addr_t rstart, bus_addr_t rend, 65 bus_size_t size, bus_size_t align, bus_size_t boundary, int cacheable, 66 bus_addr_t *addrp, bus_space_handle_t *bshp) 67 { 68 return bus_space_alloc(t->bs_base, rstart, rend, size, align, boundary, 69 cacheable, addrp, bshp); 70 } 71 72 void 73 bs_through_bs_free(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size) 74 { 75 bus_space_free(t->bs_base, bsh, size); 76 } 77 78 79 /* 80 * Get kernel virtual address for ranges mapped BUS_SPACE_MAP_LINEAR. 81 */ 82 void * 83 bs_through_bs_vaddr(bus_space_tag_t t, bus_space_handle_t bsh) 84 { 85 return bus_space_vaddr(t->bs_base, bsh); 86 } 87 88 89 /* 90 * MMap bus space for a user application. 91 */ 92 paddr_t 93 bs_through_bs_mmap(bus_space_tag_t t, bus_addr_t addr, off_t offset, 94 int prot, int flags) 95 { 96 return bus_space_mmap(t->bs_base, addr, offset, prot, flags); 97 } 98 99 100 /* 101 * Bus barrier operations. 102 */ 103 void 104 bs_through_bs_barrier(bus_space_tag_t t, bus_space_handle_t bsh, 105 bus_size_t offset, bus_size_t len, int flags) 106 { 107 bus_space_barrier(t->bs_base, bsh, offset, len, flags); 108 } 109 110 111 /* 112 * Bus probe operations. 113 */ 114 int 115 bs_through_bs_peek(bus_space_tag_t t, bus_space_handle_t bsh, 116 bus_size_t offset, size_t size, void *ptr) 117 { 118 return bus_space_peek(t->bs_base, bsh, offset, size, ptr); 119 } 120 121 int 122 bs_through_bs_poke(bus_space_tag_t t, bus_space_handle_t bsh, 123 bus_size_t offset, size_t size, u_int32_t val) 124 { 125 return bus_space_poke(t->bs_base, bsh, offset, size, val); 126 } 127 128 129 /* 130 * Bus read (single) operations. 131 */ 132 u_int8_t 133 bs_through_bs_r_1(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset) 134 { 135 return bus_space_read_1(t->bs_base, bsh, offset); 136 } 137 138 u_int16_t 139 bs_through_bs_r_2(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset) 140 { 141 return bus_space_read_2(t->bs_base, bsh, offset); 142 } 143 144 u_int32_t 145 bs_through_bs_r_4(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset) 146 { 147 return bus_space_read_4(t->bs_base, bsh, offset); 148 } 149 150 u_int64_t 151 bs_through_bs_r_8(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset) 152 { 153 return bus_space_read_8(t->bs_base, bsh, offset); 154 } 155 156 157 /* 158 * Bus read multiple operations. 159 */ 160 void 161 bs_through_bs_rm_1(bus_space_tag_t t, bus_space_handle_t bsh, 162 bus_size_t offset, u_int8_t *addr, bus_size_t count) 163 { 164 bus_space_read_multi_1(t->bs_base, bsh, offset, addr, count); 165 } 166 167 void 168 bs_through_bs_rm_2(bus_space_tag_t t, bus_space_handle_t bsh, 169 bus_size_t offset, u_int16_t *addr, bus_size_t count) 170 { 171 bus_space_read_multi_2(t->bs_base, bsh, offset, addr, count); 172 } 173 174 void 175 bs_through_bs_rm_4(bus_space_tag_t t, bus_space_handle_t bsh, 176 bus_size_t offset, u_int32_t *addr, bus_size_t count) 177 { 178 bus_space_read_multi_4(t->bs_base, bsh, offset, addr, count); 179 } 180 181 void 182 bs_through_bs_rm_8(bus_space_tag_t t, bus_space_handle_t bsh, 183 bus_size_t offset, u_int64_t *addr, bus_size_t count) 184 { 185 bus_space_read_multi_8(t->bs_base, bsh, offset, addr, count); 186 } 187 188 189 /* 190 * Bus read region operations. 191 */ 192 void 193 bs_through_bs_rr_1(bus_space_tag_t t, bus_space_handle_t bsh, 194 bus_size_t offset, u_int8_t *addr, bus_size_t count) 195 { 196 bus_space_read_region_1(t->bs_base, bsh, offset, addr, count); 197 } 198 199 void 200 bs_through_bs_rr_2(bus_space_tag_t t, bus_space_handle_t bsh, 201 bus_size_t offset, u_int16_t *addr, bus_size_t count) 202 { 203 bus_space_read_region_2(t->bs_base, bsh, offset, addr, count); 204 } 205 206 void 207 bs_through_bs_rr_4(bus_space_tag_t t, bus_space_handle_t bsh, 208 bus_size_t offset, u_int32_t *addr, bus_size_t count) 209 { 210 bus_space_read_region_4(t->bs_base, bsh, offset, addr, count); 211 } 212 213 void 214 bs_through_bs_rr_8(bus_space_tag_t t, bus_space_handle_t bsh, 215 bus_size_t offset, u_int64_t *addr, bus_size_t count) 216 { 217 bus_space_read_region_8(t->bs_base, bsh, offset, addr, count); 218 } 219 220 221 /* 222 * Bus write (single) operations. 223 */ 224 void 225 bs_through_bs_w_1(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset, 226 u_int8_t value) 227 { 228 bus_space_write_1(t->bs_base, bsh, offset, value); 229 } 230 231 void 232 bs_through_bs_w_2(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset, 233 u_int16_t value) 234 { 235 bus_space_write_2(t->bs_base, bsh, offset, value); 236 } 237 238 void 239 bs_through_bs_w_4(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset, 240 u_int32_t value) 241 { 242 bus_space_write_4(t->bs_base, bsh, offset, value); 243 } 244 245 void 246 bs_through_bs_w_8(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset, 247 u_int64_t value) 248 { 249 bus_space_write_8(t->bs_base, bsh, offset, value); 250 } 251 252 253 /* 254 * Bus write multiple operations. 255 */ 256 void 257 bs_through_bs_wm_1(bus_space_tag_t t, bus_space_handle_t bsh, 258 bus_size_t offset, const u_int8_t *addr, bus_size_t count) 259 { 260 bus_space_write_multi_1(t->bs_base, bsh, offset, addr, count); 261 } 262 263 void 264 bs_through_bs_wm_2(bus_space_tag_t t, bus_space_handle_t bsh, 265 bus_size_t offset, const u_int16_t *addr, bus_size_t count) 266 { 267 bus_space_write_multi_2(t->bs_base, bsh, offset, addr, count); 268 } 269 270 void 271 bs_through_bs_wm_4(bus_space_tag_t t, bus_space_handle_t bsh, 272 bus_size_t offset, const u_int32_t *addr, bus_size_t count) 273 { 274 bus_space_write_multi_4(t->bs_base, bsh, offset, addr, count); 275 } 276 277 void 278 bs_through_bs_wm_8(bus_space_tag_t t, bus_space_handle_t bsh, 279 bus_size_t offset, const u_int64_t *addr, bus_size_t count) 280 { 281 bus_space_write_multi_8(t->bs_base, bsh, offset, addr, count); 282 } 283 284 285 /* 286 * Bus write region operations. 287 */ 288 void 289 bs_through_bs_wr_1(bus_space_tag_t t, bus_space_handle_t bsh, 290 bus_size_t offset, const u_int8_t *addr, bus_size_t count) 291 { 292 bus_space_write_region_1(t->bs_base, bsh, offset, addr, count); 293 } 294 295 void 296 bs_through_bs_wr_2(bus_space_tag_t t, bus_space_handle_t bsh, 297 bus_size_t offset, const u_int16_t *addr, bus_size_t count) 298 { 299 bus_space_write_region_2(t->bs_base, bsh, offset, addr, count); 300 } 301 302 void 303 bs_through_bs_wr_4(bus_space_tag_t t, bus_space_handle_t bsh, 304 bus_size_t offset, const u_int32_t *addr, bus_size_t count) 305 { 306 bus_space_write_region_4(t->bs_base, bsh, offset, addr, count); 307 } 308 309 void 310 bs_through_bs_wr_8(bus_space_tag_t t, bus_space_handle_t bsh, 311 bus_size_t offset, const u_int64_t *addr, bus_size_t count) 312 { 313 bus_space_write_region_8(t->bs_base, bsh, offset, addr, count); 314 } 315 316 #ifdef BUS_SPACE_HAS_REAL_STREAM_METHODS 317 /* 318 * Bus read (single) operations. 319 */ 320 u_int8_t 321 bs_through_bs_rs_1(bus_space_tag_t t, bus_space_handle_t bsh, 322 bus_size_t offset) 323 { 324 return bus_space_read_stream_1(t->bs_base, bsh, offset); 325 } 326 327 u_int16_t 328 bs_through_bs_rs_2(bus_space_tag_t t, bus_space_handle_t bsh, 329 bus_size_t offset) 330 { 331 return bus_space_read_stream_2(t->bs_base, bsh, offset); 332 } 333 334 u_int32_t 335 bs_through_bs_rs_4(bus_space_tag_t t, bus_space_handle_t bsh, 336 bus_size_t offset) 337 { 338 return bus_space_read_stream_4(t->bs_base, bsh, offset); 339 } 340 341 u_int64_t 342 bs_through_bs_rs_8(bus_space_tag_t t, bus_space_handle_t bsh, 343 bus_size_t offset) 344 { 345 return bus_space_read_stream_8(t->bs_base, bsh, offset); 346 } 347 348 349 /* 350 * Bus read multiple operations. 351 */ 352 void 353 bs_through_bs_rms_1(bus_space_tag_t t, bus_space_handle_t bsh, 354 bus_size_t offset, u_int8_t *addr, bus_size_t count) 355 { 356 bus_space_read_multi_stream_1(t->bs_base, bsh, offset, addr, count); 357 } 358 359 void 360 bs_through_bs_rms_2(bus_space_tag_t t, bus_space_handle_t bsh, 361 bus_size_t offset, u_int16_t *addr, bus_size_t count) 362 { 363 bus_space_read_multi_stream_2(t->bs_base, bsh, offset, addr, count); 364 } 365 366 void 367 bs_through_bs_rms_4(bus_space_tag_t t, bus_space_handle_t bsh, 368 bus_size_t offset, u_int32_t *addr, bus_size_t count) 369 { 370 bus_space_read_multi_stream_4(t->bs_base, bsh, offset, addr, count); 371 } 372 373 void 374 bs_through_bs_rms_8(bus_space_tag_t t, bus_space_handle_t bsh, 375 bus_size_t offset, u_int64_t *addr, bus_size_t count) 376 { 377 bus_space_read_multi_stream_8(t->bs_base, bsh, offset, addr, count); 378 } 379 380 381 /* 382 * Bus read region operations. 383 */ 384 void 385 bs_through_bs_rrs_1(bus_space_tag_t t, bus_space_handle_t bsh, 386 bus_size_t offset, u_int8_t *addr, bus_size_t count) 387 { 388 bus_space_read_reagion_stream_1(t->bs_base, bsh, offset, addr, count); 389 } 390 391 void 392 bs_through_bs_rrs_2(bus_space_tag_t t, bus_space_handle_t bsh, 393 bus_size_t offset, u_int16_t *addr, bus_size_t count) 394 { 395 bus_space_read_reagion_stream_2(t->bs_base, bsh, offset, addr, count); 396 } 397 398 void 399 bs_through_bs_rrs_4(bus_space_tag_t t, bus_space_handle_t bsh, 400 bus_size_t offset, u_int32_t *addr, bus_size_t count) 401 { 402 bus_space_read_reagion_stream_4(t->bs_base, bsh, offset, addr, count); 403 } 404 405 void 406 bs_through_bs_rrs_8(bus_space_tag_t t, bus_space_handle_t bsh, 407 bus_size_t offset, u_int64_t *addr, bus_size_t count) 408 { 409 bus_space_read_reagion_stream_8(t->bs_base, bsh, offset, addr, count); 410 } 411 412 413 /* 414 * Bus write (single) operations. 415 */ 416 void 417 bs_through_bs_ws_1(bus_space_tag_t t, bus_space_handle_t bsh, 418 bus_size_t offset, u_int8_t value) 419 { 420 bus_space_write_stream_1(t->bs_base, bsh, offset, value); 421 } 422 423 void 424 bs_through_bs_ws_2(bus_space_tag_t t, bus_space_handle_t bsh, 425 bus_size_t offset, u_int16_t value) 426 { 427 bus_space_write_stream_2(t->bs_base, bsh, offset, value); 428 } 429 430 void 431 bs_through_bs_ws_4(bus_space_tag_t t, bus_space_handle_t bsh, 432 bus_size_t offset, u_int32_t value) 433 { 434 bus_space_write_stream_4(t->bs_base, bsh, offset, value); 435 } 436 437 void 438 bs_through_bs_ws_8(bus_space_tag_t t, bus_space_handle_t bsh, 439 bus_size_t offset, u_int64_t value) 440 { 441 bus_space_write_stream_8(t->bs_base, bsh, offset, value); 442 } 443 444 445 /* 446 * Bus write multiple operations. 447 */ 448 void 449 bs_through_bs_wms_1(bus_space_tag_t t, bus_space_handle_t bsh, 450 bus_size_t offset, const u_int8_t *addr, bus_size_t count) 451 { 452 bus_space_write_multi_stream_1(t->bs_base, bsh, offset, addr, count); 453 } 454 455 void 456 bs_through_bs_wms_2(bus_space_tag_t t, bus_space_handle_t bsh, 457 bus_size_t offset, const u_int16_t *addr, bus_size_t count) 458 { 459 bus_space_write_multi_stream_2(t->bs_base, bsh, offset, addr, count); 460 } 461 462 void 463 bs_through_bs_wms_4(bus_space_tag_t t, bus_space_handle_t bsh, 464 bus_size_t offset, const u_int32_t *addr, bus_size_t count) 465 { 466 bus_space_write_multi_stream_4(t->bs_base, bsh, offset, addr, count); 467 } 468 469 void 470 bs_through_bs_wms_8(bus_space_tag_t t, bus_space_handle_t bsh, 471 bus_size_t offset, const u_int64_t *addr, bus_size_t count) 472 { 473 bus_space_write_multi_stream_8(t->bs_base, bsh, offset, addr, count); 474 } 475 476 477 /* 478 * Bus write region operations. 479 */ 480 void 481 bs_through_bs_wrs_1(bus_space_tag_t t, bus_space_handle_t bsh, 482 bus_size_t offset, const u_int8_t *addr, bus_size_t count) 483 { 484 bus_space_write_region_stream_1(t->bs_base, bsh, offset, addr, count); 485 } 486 487 void 488 bs_through_bs_wrs_2(bus_space_tag_t t, bus_space_handle_t bsh, 489 bus_size_t offset, const u_int16_t *addr, bus_size_t count) 490 { 491 bus_space_write_region_stream_2(t->bs_base, bsh, offset, addr, count); 492 } 493 494 void 495 bs_through_bs_wrs_4(bus_space_tag_t t, bus_space_handle_t bsh, 496 bus_size_t offset, const u_int32_t *addr, bus_size_t count) 497 { 498 bus_space_write_region_stream_4(t->bs_base, bsh, offset, addr, count); 499 } 500 501 void 502 bs_through_bs_wrs_8(bus_space_tag_t t, bus_space_handle_t bsh, 503 bus_size_t offset, const u_int64_t *addr, bus_size_t count) 504 { 505 bus_space_write_region_stream_8(t->bs_base, bsh, offset, addr, count); 506 } 507 #endif /* ! BUS_SPACE_HAS_REAL_STREAM_METHODS */ 508 509 510 /* 511 * Set multiple operations. 512 */ 513 void 514 bs_through_bs_sm_1(bus_space_tag_t t, bus_space_handle_t bsh, 515 bus_size_t offset, u_int8_t value, bus_size_t count) 516 { 517 bus_space_set_multi_1(t->bs_base, bsh, offset, value, count); 518 } 519 520 void 521 bs_through_bs_sm_2(bus_space_tag_t t, bus_space_handle_t bsh, 522 bus_size_t offset, u_int16_t value, bus_size_t count) 523 { 524 bus_space_set_multi_2(t->bs_base, bsh, offset, value, count); 525 } 526 527 void 528 bs_through_bs_sm_4(bus_space_tag_t t, bus_space_handle_t bsh, 529 bus_size_t offset, u_int32_t value, bus_size_t count) 530 { 531 bus_space_set_multi_4(t->bs_base, bsh, offset, value, count); 532 } 533 534 void 535 bs_through_bs_sm_8(bus_space_tag_t t, bus_space_handle_t bsh, 536 bus_size_t offset, u_int64_t value, bus_size_t count) 537 { 538 bus_space_set_multi_8(t->bs_base, bsh, offset, value, count); 539 } 540 541 /* 542 * Set region operations. 543 */ 544 void 545 bs_through_bs_sr_1(bus_space_tag_t t, bus_space_handle_t bsh, 546 bus_size_t offset, u_int8_t value, bus_size_t count) 547 { 548 bus_space_set_region_1(t->bs_base, bsh, offset, value, count); 549 } 550 551 void 552 bs_through_bs_sr_2(bus_space_tag_t t, bus_space_handle_t bsh, 553 bus_size_t offset, u_int16_t value, bus_size_t count) 554 { 555 bus_space_set_region_2(t->bs_base, bsh, offset, value, count); 556 } 557 558 void 559 bs_through_bs_sr_4(bus_space_tag_t t, bus_space_handle_t bsh, 560 bus_size_t offset, u_int32_t value, bus_size_t count) 561 { 562 bus_space_set_region_4(t->bs_base, bsh, offset, value, count); 563 } 564 565 void 566 bs_through_bs_sr_8(bus_space_tag_t t, bus_space_handle_t bsh, 567 bus_size_t offset, u_int64_t value, bus_size_t count) 568 { 569 bus_space_set_region_8(t->bs_base, bsh, offset, value, count); 570 } 571 572 573 /* 574 * Copy operations. 575 */ 576 void 577 bs_through_bs_c_1(bus_space_tag_t t, bus_space_handle_t bsh1, 578 bus_size_t offset1, bus_space_handle_t bsh2, 579 bus_size_t offset2, bus_size_t n) 580 { 581 bus_space_copy_region_1(t->bs_base, bsh1, offset1, bsh2, offset2, n); 582 } 583 584 void 585 bs_through_bs_c_2(bus_space_tag_t t, bus_space_handle_t bsh1, 586 bus_size_t offset1, bus_space_handle_t bsh2, 587 bus_size_t offset2, bus_size_t n) 588 { 589 bus_space_copy_region_2(t->bs_base, bsh1, offset1, bsh2, offset2, n); 590 } 591 592 void 593 bs_through_bs_c_4(bus_space_tag_t t, bus_space_handle_t bsh1, 594 bus_size_t offset1, bus_space_handle_t bsh2, 595 bus_size_t offset2, bus_size_t n) 596 { 597 bus_space_copy_region_4(t->bs_base, bsh1, offset1, bsh2, offset2, n); 598 } 599 600 void 601 bs_through_bs_c_8(bus_space_tag_t t, bus_space_handle_t bsh1, 602 bus_size_t offset1, bus_space_handle_t bsh2, 603 bus_size_t offset2, bus_size_t n) 604 { 605 bus_space_copy_region_8(t->bs_base, bsh1, offset1, bsh2, offset2, n); 606 } 607