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