bus_space_rmi.c revision 201917
1/*- 2 * Copyright (c) 2009 RMI Corporation 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD$ 27 */ 28#include <sys/cdefs.h> 29__FBSDID("$FreeBSD$"); 30 31#include <sys/param.h> 32#include <sys/systm.h> 33#include <sys/bus.h> 34#include <sys/kernel.h> 35#include <sys/malloc.h> 36#include <sys/ktr.h> 37 38#include <vm/vm.h> 39#include <vm/pmap.h> 40#include <vm/vm_kern.h> 41#include <vm/vm_extern.h> 42 43#include <machine/bus.h> 44#include <machine/cache.h> 45void xlr_print_int(uint32_t); 46 47static int 48rmi_bus_space_map(void *t, bus_addr_t addr, 49 bus_size_t size, int flags, 50 bus_space_handle_t * bshp); 51 52 53static void 54rmi_bus_space_unmap(void *t, bus_space_handle_t bsh, 55 bus_size_t size); 56 57static int 58rmi_bus_space_subregion(void *t, 59 bus_space_handle_t bsh, 60 bus_size_t offset, bus_size_t size, 61 bus_space_handle_t * nbshp); 62 63static u_int8_t 64rmi_bus_space_read_1(void *t, 65 bus_space_handle_t handle, 66 bus_size_t offset); 67 68static u_int16_t 69rmi_bus_space_read_2(void *t, 70 bus_space_handle_t handle, 71 bus_size_t offset); 72 73static u_int32_t 74rmi_bus_space_read_4(void *t, 75 bus_space_handle_t handle, 76 bus_size_t offset); 77 78static void 79rmi_bus_space_read_multi_1(void *t, 80 bus_space_handle_t handle, 81 bus_size_t offset, u_int8_t * addr, 82 size_t count); 83 84static void 85rmi_bus_space_read_multi_2(void *t, 86 bus_space_handle_t handle, 87 bus_size_t offset, u_int16_t * addr, 88 size_t count); 89 90static void 91rmi_bus_space_read_multi_4(void *t, 92 bus_space_handle_t handle, 93 bus_size_t offset, u_int32_t * addr, 94 size_t count); 95 96static void 97rmi_bus_space_read_region_1(void *t, 98 bus_space_handle_t bsh, 99 bus_size_t offset, u_int8_t * addr, 100 size_t count); 101 102static void 103rmi_bus_space_read_region_2(void *t, 104 bus_space_handle_t bsh, 105 bus_size_t offset, u_int16_t * addr, 106 size_t count); 107 108static void 109rmi_bus_space_read_region_4(void *t, 110 bus_space_handle_t bsh, 111 bus_size_t offset, u_int32_t * addr, 112 size_t count); 113 114static void 115rmi_bus_space_write_1(void *t, 116 bus_space_handle_t handle, 117 bus_size_t offset, u_int8_t value); 118 119static void 120rmi_bus_space_write_2(void *t, 121 bus_space_handle_t handle, 122 bus_size_t offset, u_int16_t value); 123 124static void 125rmi_bus_space_write_4(void *t, 126 bus_space_handle_t handle, 127 bus_size_t offset, u_int32_t value); 128 129static void 130rmi_bus_space_write_multi_1(void *t, 131 bus_space_handle_t handle, 132 bus_size_t offset, 133 const u_int8_t * addr, 134 size_t count); 135static void 136rmi_bus_space_write_multi_2(void *t, 137 bus_space_handle_t handle, 138 bus_size_t offset, 139 const u_int16_t * addr, 140 size_t count); 141 142static void 143rmi_bus_space_write_multi_4(void *t, 144 bus_space_handle_t handle, 145 bus_size_t offset, 146 const u_int32_t * addr, 147 size_t count); 148 149static void 150rmi_bus_space_write_region_2(void *t, 151 bus_space_handle_t bsh, 152 bus_size_t offset, 153 const u_int16_t * addr, 154 size_t count); 155 156static void 157rmi_bus_space_write_region_4(void *t, 158 bus_space_handle_t bsh, 159 bus_size_t offset, 160 const u_int32_t * addr, 161 size_t count); 162 163 164static void 165rmi_bus_space_set_region_2(void *t, 166 bus_space_handle_t bsh, 167 bus_size_t offset, u_int16_t value, 168 size_t count); 169static void 170rmi_bus_space_set_region_4(void *t, 171 bus_space_handle_t bsh, 172 bus_size_t offset, u_int32_t value, 173 size_t count); 174 175static void 176rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 177 bus_size_t offset __unused, bus_size_t len __unused, int flags); 178 179 180static void 181rmi_bus_space_copy_region_2(void *t, 182 bus_space_handle_t bsh1, 183 bus_size_t off1, 184 bus_space_handle_t bsh2, 185 bus_size_t off2, size_t count); 186 187u_int8_t 188rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 189 bus_size_t offset); 190 191static u_int16_t 192rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 193 bus_size_t offset); 194 195static u_int32_t 196rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 197 bus_size_t offset); 198static void 199rmi_bus_space_read_multi_stream_1(void *t, 200 bus_space_handle_t handle, 201 bus_size_t offset, u_int8_t * addr, 202 size_t count); 203 204static void 205rmi_bus_space_read_multi_stream_2(void *t, 206 bus_space_handle_t handle, 207 bus_size_t offset, u_int16_t * addr, 208 size_t count); 209 210static void 211rmi_bus_space_read_multi_stream_4(void *t, 212 bus_space_handle_t handle, 213 bus_size_t offset, u_int32_t * addr, 214 size_t count); 215 216void 217rmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, 218 bus_size_t offset, u_int8_t value); 219static void 220rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 221 bus_size_t offset, u_int16_t value); 222 223static void 224rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 225 bus_size_t offset, u_int32_t value); 226 227static void 228rmi_bus_space_write_multi_stream_1(void *t, 229 bus_space_handle_t handle, 230 bus_size_t offset, 231 const u_int8_t * addr, 232 size_t count); 233static void 234rmi_bus_space_write_multi_stream_2(void *t, 235 bus_space_handle_t handle, 236 bus_size_t offset, 237 const u_int16_t * addr, 238 size_t count); 239 240static void 241rmi_bus_space_write_multi_stream_4(void *t, 242 bus_space_handle_t handle, 243 bus_size_t offset, 244 const u_int32_t * addr, 245 size_t count); 246 247 248static struct bus_space local_rmi_bus_space = { 249 /* cookie */ 250 (void *)0, 251 252 /* mapping/unmapping */ 253 rmi_bus_space_map, 254 rmi_bus_space_unmap, 255 rmi_bus_space_subregion, 256 257 /* allocation/deallocation */ 258 NULL, 259 NULL, 260 261 /* barrier */ 262 rmi_bus_space_barrier, 263 264 /* read (single) */ 265 rmi_bus_space_read_1, 266 rmi_bus_space_read_2, 267 rmi_bus_space_read_4, 268 NULL, 269 270 /* read multiple */ 271 rmi_bus_space_read_multi_1, 272 rmi_bus_space_read_multi_2, 273 rmi_bus_space_read_multi_4, 274 NULL, 275 276 /* read region */ 277 rmi_bus_space_read_region_1, 278 rmi_bus_space_read_region_2, 279 rmi_bus_space_read_region_4, 280 NULL, 281 282 /* write (single) */ 283 rmi_bus_space_write_1, 284 rmi_bus_space_write_2, 285 rmi_bus_space_write_4, 286 NULL, 287 288 /* write multiple */ 289 rmi_bus_space_write_multi_1, 290 rmi_bus_space_write_multi_2, 291 rmi_bus_space_write_multi_4, 292 NULL, 293 294 /* write region */ 295 NULL, 296 rmi_bus_space_write_region_2, 297 rmi_bus_space_write_region_4, 298 NULL, 299 300 /* set multiple */ 301 NULL, 302 NULL, 303 NULL, 304 NULL, 305 306 /* set region */ 307 NULL, 308 rmi_bus_space_set_region_2, 309 rmi_bus_space_set_region_4, 310 NULL, 311 312 /* copy */ 313 NULL, 314 rmi_bus_space_copy_region_2, 315 NULL, 316 NULL, 317 318 /* read (single) stream */ 319 rmi_bus_space_read_stream_1, 320 rmi_bus_space_read_stream_2, 321 rmi_bus_space_read_stream_4, 322 NULL, 323 324 /* read multiple stream */ 325 rmi_bus_space_read_multi_stream_1, 326 rmi_bus_space_read_multi_stream_2, 327 rmi_bus_space_read_multi_stream_4, 328 NULL, 329 330 /* read region stream */ 331 rmi_bus_space_read_region_1, 332 rmi_bus_space_read_region_2, 333 rmi_bus_space_read_region_4, 334 NULL, 335 336 /* write (single) stream */ 337 rmi_bus_space_write_stream_1, 338 rmi_bus_space_write_stream_2, 339 rmi_bus_space_write_stream_4, 340 NULL, 341 342 /* write multiple stream */ 343 rmi_bus_space_write_multi_stream_1, 344 rmi_bus_space_write_multi_stream_2, 345 rmi_bus_space_write_multi_stream_4, 346 NULL, 347 348 /* write region stream */ 349 NULL, 350 rmi_bus_space_write_region_2, 351 rmi_bus_space_write_region_4, 352 NULL, 353}; 354 355/* generic bus_space tag */ 356bus_space_tag_t rmi_bus_space = &local_rmi_bus_space; 357 358#define MIPS_BUS_SPACE_IO 0 /* space is i/o space */ 359#define MIPS_BUS_SPACE_MEM 1 /* space is mem space */ 360#define MIPS_BUS_SPACE_PCI 10 /* avoid conflict with other spaces */ 361 362#define BUS_SPACE_UNRESTRICTED (~0) 363 364#define SWAP32(x)\ 365 (((x) & 0xff000000) >> 24) | \ 366 (((x) & 0x000000ff) << 24) | \ 367 (((x) & 0x0000ff00) << 8) | \ 368 (((x) & 0x00ff0000) >> 8) 369 370#define SWAP16(x)\ 371 (((x) & 0xff00) >> 8) | \ 372 (((x) & 0x00ff) << 8) 373 374/* 375 * Map a region of device bus space into CPU virtual address space. 376 */ 377 378 379static int 380rmi_bus_space_map(void *t __unused, bus_addr_t addr, 381 bus_size_t size __unused, int flags __unused, 382 bus_space_handle_t * bshp) 383{ 384 385 *bshp = addr; 386 return (0); 387} 388 389/* 390 * Unmap a region of device bus space. 391 */ 392static void 393rmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, 394 bus_size_t size __unused) 395{ 396} 397 398/* 399 * Get a new handle for a subregion of an already-mapped area of bus space. 400 */ 401 402static int 403rmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, 404 bus_size_t offset, bus_size_t size __unused, 405 bus_space_handle_t * nbshp) 406{ 407 *nbshp = bsh + offset; 408 return (0); 409} 410 411/* 412 * Read a 1, 2, 4, or 8 byte quantity from bus space 413 * described by tag/handle/offset. 414 */ 415 416static u_int8_t 417rmi_bus_space_read_1(void *tag, bus_space_handle_t handle, 418 bus_size_t offset) 419{ 420 if ((int)tag == MIPS_BUS_SPACE_PCI) 421 return (u_int8_t) (*(volatile u_int8_t *)(handle + offset)); 422 else 423 return (u_int8_t) (*(volatile u_int32_t *)(handle + offset)); 424} 425 426static u_int16_t 427rmi_bus_space_read_2(void *tag, bus_space_handle_t handle, 428 bus_size_t offset) 429{ 430 if ((int)tag == MIPS_BUS_SPACE_PCI) 431 return SWAP16((u_int16_t) (*(volatile u_int16_t *)(handle + offset))); 432 else 433 return *(volatile u_int16_t *)(handle + offset); 434} 435 436static u_int32_t 437rmi_bus_space_read_4(void *tag, bus_space_handle_t handle, 438 bus_size_t offset) 439{ 440 if ((int)tag == MIPS_BUS_SPACE_PCI) 441 return SWAP32((*(volatile u_int32_t *)(handle + offset))); 442 else 443 return (*(volatile u_int32_t *)(handle + offset)); 444} 445 446 447 448/* 449 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 450 * described by tag/handle/offset and copy into buffer provided. 451 */ 452static void 453rmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, 454 bus_size_t offset, u_int8_t * addr, size_t count) 455{ 456 457 if ((int)tag != MIPS_BUS_SPACE_PCI) 458 return; 459 while (count--) { 460 *addr = (*(volatile u_int8_t *)(handle + offset)); 461 addr++; 462 } 463} 464 465static void 466rmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, 467 bus_size_t offset, u_int16_t * addr, size_t count) 468{ 469 470 if ((int)tag != MIPS_BUS_SPACE_PCI) 471 return; 472 while (count--) { 473 *addr = *(volatile u_int16_t *)(handle + offset); 474 *addr = SWAP16(*addr); 475 addr++; 476 } 477} 478 479static void 480rmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, 481 bus_size_t offset, u_int32_t * addr, size_t count) 482{ 483 484 if ((int)tag != MIPS_BUS_SPACE_PCI) 485 return; 486 while (count--) { 487 *addr = *(volatile u_int32_t *)(handle + offset); 488 *addr = SWAP32(*addr); 489 addr++; 490 } 491} 492 493/* 494 * Write the 1, 2, 4, or 8 byte value `value' to bus space 495 * described by tag/handle/offset. 496 */ 497 498 499static void 500rmi_bus_space_write_1(void *tag, bus_space_handle_t handle, 501 bus_size_t offset, u_int8_t value) 502{ 503 mips_sync(); 504 if ((int)tag == MIPS_BUS_SPACE_PCI) 505 *(volatile u_int8_t *)(handle + offset) = value; 506 else 507 *(volatile u_int32_t *)(handle + offset) = (u_int32_t) value; 508} 509 510static void 511rmi_bus_space_write_2(void *tag, bus_space_handle_t handle, 512 bus_size_t offset, u_int16_t value) 513{ 514 mips_sync(); 515 if ((int)tag == MIPS_BUS_SPACE_PCI) { 516 *(volatile u_int16_t *)(handle + offset) = SWAP16(value); 517 } else 518 *(volatile u_int16_t *)(handle + offset) = value; 519} 520 521 522static void 523rmi_bus_space_write_4(void *tag, bus_space_handle_t handle, 524 bus_size_t offset, u_int32_t value) 525{ 526 mips_sync(); 527 if ((int)tag == MIPS_BUS_SPACE_PCI) { 528 *(volatile u_int32_t *)(handle + offset) = SWAP32(value); 529 } else 530 *(volatile u_int32_t *)(handle + offset) = value; 531} 532 533 534 535/* 536 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 537 * provided to bus space described by tag/handle/offset. 538 */ 539 540 541static void 542rmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, 543 bus_size_t offset, const u_int8_t * addr, size_t count) 544{ 545 mips_sync(); 546 if ((int)tag != MIPS_BUS_SPACE_PCI) 547 return; 548 while (count--) { 549 (*(volatile u_int8_t *)(handle + offset)) = *addr; 550 addr++; 551 } 552} 553 554static void 555rmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, 556 bus_size_t offset, const u_int16_t * addr, size_t count) 557{ 558 mips_sync(); 559 if ((int)tag != MIPS_BUS_SPACE_PCI) 560 return; 561 while (count--) { 562 (*(volatile u_int16_t *)(handle + offset)) = SWAP16(*addr); 563 addr++; 564 } 565} 566 567static void 568rmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, 569 bus_size_t offset, const u_int32_t * addr, size_t count) 570{ 571 mips_sync(); 572 if ((int)tag != MIPS_BUS_SPACE_PCI) 573 return; 574 while (count--) { 575 (*(volatile u_int32_t *)(handle + offset)) = SWAP32(*addr); 576 addr++; 577 } 578} 579 580/* 581 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 582 * by tag/handle starting at `offset'. 583 */ 584 585static void 586rmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh, 587 bus_size_t offset, u_int16_t value, size_t count) 588{ 589 bus_addr_t addr = bsh + offset; 590 591 for (; count != 0; count--, addr += 2) 592 (*(volatile u_int16_t *)(addr)) = value; 593} 594 595static void 596rmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh, 597 bus_size_t offset, u_int32_t value, size_t count) 598{ 599 bus_addr_t addr = bsh + offset; 600 601 for (; count != 0; count--, addr += 4) 602 (*(volatile u_int32_t *)(addr)) = value; 603} 604 605 606/* 607 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 608 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 609 */ 610static void 611rmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, 612 bus_size_t off1, bus_space_handle_t bsh2, 613 bus_size_t off2, size_t count) 614{ 615 printf("bus_space_copy_region_2 - unimplemented\n"); 616} 617 618/* 619 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 620 * described by tag/handle/offset and copy into buffer provided. 621 */ 622 623u_int8_t 624rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 625 bus_size_t offset) 626{ 627 628 return *((volatile u_int8_t *)(handle + offset)); 629} 630 631 632static u_int16_t 633rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 634 bus_size_t offset) 635{ 636 return *(volatile u_int16_t *)(handle + offset); 637} 638 639 640static u_int32_t 641rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 642 bus_size_t offset) 643{ 644 return (*(volatile u_int32_t *)(handle + offset)); 645} 646 647 648static void 649rmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, 650 bus_size_t offset, u_int8_t * addr, size_t count) 651{ 652 653 if ((int)tag != MIPS_BUS_SPACE_PCI) 654 return; 655 while (count--) { 656 *addr = (*(volatile u_int8_t *)(handle + offset)); 657 addr++; 658 } 659} 660 661static void 662rmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, 663 bus_size_t offset, u_int16_t * addr, size_t count) 664{ 665 666 if ((int)tag != MIPS_BUS_SPACE_PCI) 667 return; 668 while (count--) { 669 *addr = (*(volatile u_int16_t *)(handle + offset)); 670 addr++; 671 } 672} 673 674static void 675rmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, 676 bus_size_t offset, u_int32_t * addr, size_t count) 677{ 678 679 if ((int)tag != MIPS_BUS_SPACE_PCI) 680 return; 681 while (count--) { 682 *addr = (*(volatile u_int32_t *)(handle + offset)); 683 addr++; 684 } 685} 686 687 688 689/* 690 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 691 * described by tag/handle and starting at `offset' and copy into 692 * buffer provided. 693 */ 694void 695rmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh, 696 bus_size_t offset, u_int8_t * addr, size_t count) 697{ 698 bus_addr_t baddr = bsh + offset; 699 700 while (count--) { 701 *addr++ = (*(volatile u_int8_t *)(baddr)); 702 baddr += 1; 703 } 704} 705 706void 707rmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh, 708 bus_size_t offset, u_int16_t * addr, size_t count) 709{ 710 bus_addr_t baddr = bsh + offset; 711 712 while (count--) { 713 *addr++ = (*(volatile u_int16_t *)(baddr)); 714 baddr += 2; 715 } 716} 717 718void 719rmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh, 720 bus_size_t offset, u_int32_t * addr, size_t count) 721{ 722 bus_addr_t baddr = bsh + offset; 723 724 while (count--) { 725 *addr++ = (*(volatile u_int32_t *)(baddr)); 726 baddr += 4; 727 } 728} 729 730 731void 732rmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle, 733 bus_size_t offset, u_int8_t value) 734{ 735 mips_sync(); 736 *(volatile u_int8_t *)(handle + offset) = value; 737} 738 739 740static void 741rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 742 bus_size_t offset, u_int16_t value) 743{ 744 mips_sync(); 745 *(volatile u_int16_t *)(handle + offset) = value; 746} 747 748 749static void 750rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 751 bus_size_t offset, u_int32_t value) 752{ 753 mips_sync(); 754 *(volatile u_int32_t *)(handle + offset) = value; 755} 756 757 758static void 759rmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, 760 bus_size_t offset, const u_int8_t * addr, size_t count) 761{ 762 mips_sync(); 763 if ((int)tag != MIPS_BUS_SPACE_PCI) 764 return; 765 while (count--) { 766 (*(volatile u_int8_t *)(handle + offset)) = *addr; 767 addr++; 768 } 769} 770 771static void 772rmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, 773 bus_size_t offset, const u_int16_t * addr, size_t count) 774{ 775 mips_sync(); 776 if ((int)tag != MIPS_BUS_SPACE_PCI) 777 return; 778 while (count--) { 779 (*(volatile u_int16_t *)(handle + offset)) = *addr; 780 addr++; 781 } 782} 783 784static void 785rmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, 786 bus_size_t offset, const u_int32_t * addr, size_t count) 787{ 788 mips_sync(); 789 if ((int)tag != MIPS_BUS_SPACE_PCI) 790 return; 791 while (count--) { 792 (*(volatile u_int32_t *)(handle + offset)) = *addr; 793 addr++; 794 } 795} 796 797void 798rmi_bus_space_write_region_2(void *t, 799 bus_space_handle_t bsh, 800 bus_size_t offset, 801 const u_int16_t * addr, 802 size_t count) 803{ 804 bus_addr_t baddr = (bus_addr_t) bsh + offset; 805 806 while (count--) { 807 (*(volatile u_int16_t *)(baddr)) = *addr; 808 addr++; 809 baddr += 2; 810 } 811} 812 813void 814rmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh, 815 bus_size_t offset, const u_int32_t * addr, size_t count) 816{ 817 bus_addr_t baddr = bsh + offset; 818 819 while (count--) { 820 (*(volatile u_int32_t *)(baddr)) = *addr; 821 addr++; 822 baddr += 4; 823 } 824} 825 826static void 827rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 828 bus_size_t offset __unused, bus_size_t len __unused, int flags) 829{ 830 831} 832