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