bus_space_rmi_pci.c revision 204136
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: head/sys/mips/rmi/bus_space_rmi_pci.c 204136 2010-02-20 17:19:16Z rrs $ 27 */ 28#include <sys/cdefs.h> 29__FBSDID("$FreeBSD: head/sys/mips/rmi/bus_space_rmi_pci.c 204136 2010-02-20 17:19:16Z rrs $"); 30 31#include <sys/param.h> 32#include <sys/systm.h> 33#include <sys/bus.h> 34#include <sys/kernel.h> 35#include <sys/endian.h> 36#include <sys/malloc.h> 37#include <sys/ktr.h> 38 39#include <vm/vm.h> 40#include <vm/pmap.h> 41#include <vm/vm_kern.h> 42#include <vm/vm_extern.h> 43 44#include <machine/bus.h> 45#include <machine/cache.h> 46 47static int 48rmi_pci_bus_space_map(void *t, bus_addr_t addr, 49 bus_size_t size, int flags, 50 bus_space_handle_t * bshp); 51 52static void 53rmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh, 54 bus_size_t size); 55 56static int 57rmi_pci_bus_space_subregion(void *t, 58 bus_space_handle_t bsh, 59 bus_size_t offset, bus_size_t size, 60 bus_space_handle_t * nbshp); 61 62static u_int8_t 63rmi_pci_bus_space_read_1(void *t, 64 bus_space_handle_t handle, 65 bus_size_t offset); 66 67static u_int16_t 68rmi_pci_bus_space_read_2(void *t, 69 bus_space_handle_t handle, 70 bus_size_t offset); 71 72static u_int32_t 73rmi_pci_bus_space_read_4(void *t, 74 bus_space_handle_t handle, 75 bus_size_t offset); 76 77static void 78rmi_pci_bus_space_read_multi_1(void *t, 79 bus_space_handle_t handle, 80 bus_size_t offset, u_int8_t * addr, 81 size_t count); 82 83static void 84rmi_pci_bus_space_read_multi_2(void *t, 85 bus_space_handle_t handle, 86 bus_size_t offset, u_int16_t * addr, 87 size_t count); 88 89static void 90rmi_pci_bus_space_read_multi_4(void *t, 91 bus_space_handle_t handle, 92 bus_size_t offset, u_int32_t * addr, 93 size_t count); 94 95static void 96rmi_pci_bus_space_read_region_1(void *t, 97 bus_space_handle_t bsh, 98 bus_size_t offset, u_int8_t * addr, 99 size_t count); 100 101static void 102rmi_pci_bus_space_read_region_2(void *t, 103 bus_space_handle_t bsh, 104 bus_size_t offset, u_int16_t * addr, 105 size_t count); 106 107static void 108rmi_pci_bus_space_read_region_4(void *t, 109 bus_space_handle_t bsh, 110 bus_size_t offset, u_int32_t * addr, 111 size_t count); 112 113static void 114rmi_pci_bus_space_write_1(void *t, 115 bus_space_handle_t handle, 116 bus_size_t offset, u_int8_t value); 117 118static void 119rmi_pci_bus_space_write_2(void *t, 120 bus_space_handle_t handle, 121 bus_size_t offset, u_int16_t value); 122 123static void 124rmi_pci_bus_space_write_4(void *t, 125 bus_space_handle_t handle, 126 bus_size_t offset, u_int32_t value); 127 128static void 129rmi_pci_bus_space_write_multi_1(void *t, 130 bus_space_handle_t handle, 131 bus_size_t offset, 132 const u_int8_t * addr, 133 size_t count); 134 135static void 136rmi_pci_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_pci_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_pci_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_pci_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_pci_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_pci_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_pci_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 179static void 180rmi_pci_bus_space_copy_region_2(void *t, 181 bus_space_handle_t bsh1, 182 bus_size_t off1, 183 bus_space_handle_t bsh2, 184 bus_size_t off2, size_t count); 185 186u_int8_t 187rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 188 bus_size_t offset); 189 190static u_int16_t 191rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 192 bus_size_t offset); 193 194static u_int32_t 195rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 196 bus_size_t offset); 197static void 198rmi_pci_bus_space_read_multi_stream_1(void *t, 199 bus_space_handle_t handle, 200 bus_size_t offset, u_int8_t * addr, 201 size_t count); 202 203static void 204rmi_pci_bus_space_read_multi_stream_2(void *t, 205 bus_space_handle_t handle, 206 bus_size_t offset, u_int16_t * addr, 207 size_t count); 208 209static void 210rmi_pci_bus_space_read_multi_stream_4(void *t, 211 bus_space_handle_t handle, 212 bus_size_t offset, u_int32_t * addr, 213 size_t count); 214 215void 216rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, 217 bus_size_t offset, u_int8_t value); 218static void 219rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 220 bus_size_t offset, u_int16_t value); 221 222static void 223rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 224 bus_size_t offset, u_int32_t value); 225 226static void 227rmi_pci_bus_space_write_multi_stream_1(void *t, 228 bus_space_handle_t handle, 229 bus_size_t offset, 230 const u_int8_t * addr, 231 size_t count); 232static void 233rmi_pci_bus_space_write_multi_stream_2(void *t, 234 bus_space_handle_t handle, 235 bus_size_t offset, 236 const u_int16_t * addr, 237 size_t count); 238 239static void 240rmi_pci_bus_space_write_multi_stream_4(void *t, 241 bus_space_handle_t handle, 242 bus_size_t offset, 243 const u_int32_t * addr, 244 size_t count); 245 246#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__) 247 248static struct bus_space local_rmi_pci_bus_space = { 249 /* cookie */ 250 (void *)0, 251 252 /* mapping/unmapping */ 253 rmi_pci_bus_space_map, 254 rmi_pci_bus_space_unmap, 255 rmi_pci_bus_space_subregion, 256 257 /* allocation/deallocation */ 258 NULL, 259 NULL, 260 261 /* barrier */ 262 rmi_pci_bus_space_barrier, 263 264 /* read (single) */ 265 rmi_pci_bus_space_read_1, 266 rmi_pci_bus_space_read_2, 267 rmi_pci_bus_space_read_4, 268 NULL, 269 270 /* read multiple */ 271 rmi_pci_bus_space_read_multi_1, 272 rmi_pci_bus_space_read_multi_2, 273 rmi_pci_bus_space_read_multi_4, 274 NULL, 275 276 /* read region */ 277 rmi_pci_bus_space_read_region_1, 278 rmi_pci_bus_space_read_region_2, 279 rmi_pci_bus_space_read_region_4, 280 NULL, 281 282 /* write (single) */ 283 rmi_pci_bus_space_write_1, 284 rmi_pci_bus_space_write_2, 285 rmi_pci_bus_space_write_4, 286 NULL, 287 288 /* write multiple */ 289 rmi_pci_bus_space_write_multi_1, 290 rmi_pci_bus_space_write_multi_2, 291 rmi_pci_bus_space_write_multi_4, 292 NULL, 293 294 /* write region */ 295 NULL, 296 rmi_pci_bus_space_write_region_2, 297 rmi_pci_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_pci_bus_space_set_region_2, 309 rmi_pci_bus_space_set_region_4, 310 NULL, 311 312 /* copy */ 313 NULL, 314 rmi_pci_bus_space_copy_region_2, 315 NULL, 316 NULL, 317 318 /* read (single) stream */ 319 rmi_pci_bus_space_read_stream_1, 320 rmi_pci_bus_space_read_stream_2, 321 rmi_pci_bus_space_read_stream_4, 322 NULL, 323 324 /* read multiple stream */ 325 rmi_pci_bus_space_read_multi_stream_1, 326 rmi_pci_bus_space_read_multi_stream_2, 327 rmi_pci_bus_space_read_multi_stream_4, 328 NULL, 329 330 /* read region stream */ 331 rmi_pci_bus_space_read_region_1, 332 rmi_pci_bus_space_read_region_2, 333 rmi_pci_bus_space_read_region_4, 334 NULL, 335 336 /* write (single) stream */ 337 rmi_pci_bus_space_write_stream_1, 338 rmi_pci_bus_space_write_stream_2, 339 rmi_pci_bus_space_write_stream_4, 340 NULL, 341 342 /* write multiple stream */ 343 rmi_pci_bus_space_write_multi_stream_1, 344 rmi_pci_bus_space_write_multi_stream_2, 345 rmi_pci_bus_space_write_multi_stream_4, 346 NULL, 347 348 /* write region stream */ 349 NULL, 350 rmi_pci_bus_space_write_region_2, 351 rmi_pci_bus_space_write_region_4, 352 NULL, 353}; 354 355/* generic bus_space tag */ 356bus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space; 357 358/* 359 * Map a region of device bus space into CPU virtual address space. 360 */ 361static int 362rmi_pci_bus_space_map(void *t __unused, bus_addr_t addr, 363 bus_size_t size __unused, int flags __unused, 364 bus_space_handle_t * bshp) 365{ 366 *bshp = addr; 367 return (0); 368} 369 370/* 371 * Unmap a region of device bus space. 372 */ 373static void 374rmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, 375 bus_size_t size __unused) 376{ 377} 378 379/* 380 * Get a new handle for a subregion of an already-mapped area of bus space. 381 */ 382 383static int 384rmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, 385 bus_size_t offset, bus_size_t size __unused, 386 bus_space_handle_t * nbshp) 387{ 388 *nbshp = bsh + offset; 389 return (0); 390} 391 392/* 393 * Read a 1, 2, 4, or 8 byte quantity from bus space 394 * described by tag/handle/offset. 395 */ 396 397static u_int8_t 398rmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle, 399 bus_size_t offset) 400{ 401 return (u_int8_t) (*(volatile u_int8_t *)(handle + offset)); 402} 403 404static u_int16_t 405rmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle, 406 bus_size_t offset) 407{ 408 return bswap16((u_int16_t) (*(volatile u_int16_t *)(handle + offset))); 409} 410 411static u_int32_t 412rmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle, 413 bus_size_t offset) 414{ 415 return bswap32((*(volatile u_int32_t *)(handle + offset))); 416} 417 418 419/* 420 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 421 * described by tag/handle/offset and copy into buffer provided. 422 */ 423static void 424rmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, 425 bus_size_t offset, u_int8_t * addr, size_t count) 426{ 427 while (count--) { 428 *addr = (*(volatile u_int8_t *)(handle + offset)); 429 addr++; 430 } 431} 432 433static void 434rmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, 435 bus_size_t offset, u_int16_t * addr, size_t count) 436{ 437 438 while (count--) { 439 *addr = *(volatile u_int16_t *)(handle + offset); 440 *addr = bswap16(*addr); 441 addr++; 442 } 443} 444 445static void 446rmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, 447 bus_size_t offset, u_int32_t * addr, size_t count) 448{ 449 450 while (count--) { 451 *addr = *(volatile u_int32_t *)(handle + offset); 452 *addr = bswap32(*addr); 453 addr++; 454 } 455} 456 457/* 458 * Write the 1, 2, 4, or 8 byte value `value' to bus space 459 * described by tag/handle/offset. 460 */ 461 462static void 463rmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle, 464 bus_size_t offset, u_int8_t value) 465{ 466 mips_sync(); 467 *(volatile u_int8_t *)(handle + offset) = value; 468} 469 470static void 471rmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle, 472 bus_size_t offset, u_int16_t value) 473{ 474 mips_sync(); 475 *(volatile u_int16_t *)(handle + offset) = bswap16(value); 476} 477 478 479static void 480rmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle, 481 bus_size_t offset, u_int32_t value) 482{ 483 mips_sync(); 484 *(volatile u_int32_t *)(handle + offset) = bswap32(value); 485} 486 487/* 488 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 489 * provided to bus space described by tag/handle/offset. 490 */ 491 492 493static void 494rmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, 495 bus_size_t offset, const u_int8_t * addr, size_t count) 496{ 497 mips_sync(); 498 while (count--) { 499 (*(volatile u_int8_t *)(handle + offset)) = *addr; 500 addr++; 501 } 502} 503 504static void 505rmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, 506 bus_size_t offset, const u_int16_t * addr, size_t count) 507{ 508 mips_sync(); 509 while (count--) { 510 (*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr); 511 addr++; 512 } 513} 514 515static void 516rmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, 517 bus_size_t offset, const u_int32_t * addr, size_t count) 518{ 519 mips_sync(); 520 while (count--) { 521 (*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr); 522 addr++; 523 } 524} 525 526/* 527 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 528 * by tag/handle starting at `offset'. 529 */ 530 531static void 532rmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh, 533 bus_size_t offset, u_int16_t value, size_t count) 534{ 535 bus_addr_t addr = bsh + offset; 536 537 for (; count != 0; count--, addr += 2) 538 (*(volatile u_int16_t *)(addr)) = value; 539} 540 541static void 542rmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh, 543 bus_size_t offset, u_int32_t value, size_t count) 544{ 545 bus_addr_t addr = bsh + offset; 546 547 for (; count != 0; count--, addr += 4) 548 (*(volatile u_int32_t *)(addr)) = value; 549} 550 551 552/* 553 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 554 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 555 */ 556static void 557rmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, 558 bus_size_t off1, bus_space_handle_t bsh2, 559 bus_size_t off2, size_t count) 560{ 561 TODO(); 562} 563 564/* 565 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 566 * described by tag/handle/offset and copy into buffer provided. 567 */ 568 569u_int8_t 570rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 571 bus_size_t offset) 572{ 573 574 return *((volatile u_int8_t *)(handle + offset)); 575} 576 577 578static u_int16_t 579rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 580 bus_size_t offset) 581{ 582 return *(volatile u_int16_t *)(handle + offset); 583} 584 585 586static u_int32_t 587rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 588 bus_size_t offset) 589{ 590 return (*(volatile u_int32_t *)(handle + offset)); 591} 592 593 594static void 595rmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, 596 bus_size_t offset, u_int8_t * addr, size_t count) 597{ 598 while (count--) { 599 *addr = (*(volatile u_int8_t *)(handle + offset)); 600 addr++; 601 } 602} 603 604static void 605rmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, 606 bus_size_t offset, u_int16_t * addr, size_t count) 607{ 608 while (count--) { 609 *addr = (*(volatile u_int16_t *)(handle + offset)); 610 addr++; 611 } 612} 613 614static void 615rmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, 616 bus_size_t offset, u_int32_t * addr, size_t count) 617{ 618 while (count--) { 619 *addr = (*(volatile u_int32_t *)(handle + offset)); 620 addr++; 621 } 622} 623 624 625 626/* 627 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 628 * described by tag/handle and starting at `offset' and copy into 629 * buffer provided. 630 */ 631void 632rmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh, 633 bus_size_t offset, u_int8_t * addr, size_t count) 634{ 635 bus_addr_t baddr = bsh + offset; 636 637 while (count--) { 638 *addr++ = (*(volatile u_int8_t *)(baddr)); 639 baddr += 1; 640 } 641} 642 643void 644rmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh, 645 bus_size_t offset, u_int16_t * addr, size_t count) 646{ 647 bus_addr_t baddr = bsh + offset; 648 649 while (count--) { 650 *addr++ = (*(volatile u_int16_t *)(baddr)); 651 baddr += 2; 652 } 653} 654 655void 656rmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh, 657 bus_size_t offset, u_int32_t * addr, size_t count) 658{ 659 bus_addr_t baddr = bsh + offset; 660 661 while (count--) { 662 *addr++ = (*(volatile u_int32_t *)(baddr)); 663 baddr += 4; 664 } 665} 666 667 668void 669rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle, 670 bus_size_t offset, u_int8_t value) 671{ 672 mips_sync(); 673 *(volatile u_int8_t *)(handle + offset) = value; 674} 675 676static void 677rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 678 bus_size_t offset, u_int16_t value) 679{ 680 mips_sync(); 681 *(volatile u_int16_t *)(handle + offset) = value; 682} 683 684 685static void 686rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 687 bus_size_t offset, u_int32_t value) 688{ 689 mips_sync(); 690 *(volatile u_int32_t *)(handle + offset) = value; 691} 692 693 694static void 695rmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, 696 bus_size_t offset, const u_int8_t * addr, size_t count) 697{ 698 mips_sync(); 699 while (count--) { 700 (*(volatile u_int8_t *)(handle + offset)) = *addr; 701 addr++; 702 } 703} 704 705static void 706rmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, 707 bus_size_t offset, const u_int16_t * addr, size_t count) 708{ 709 mips_sync(); 710 while (count--) { 711 (*(volatile u_int16_t *)(handle + offset)) = *addr; 712 addr++; 713 } 714} 715 716static void 717rmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, 718 bus_size_t offset, const u_int32_t * addr, size_t count) 719{ 720 mips_sync(); 721 while (count--) { 722 (*(volatile u_int32_t *)(handle + offset)) = *addr; 723 addr++; 724 } 725} 726 727void 728rmi_pci_bus_space_write_region_2(void *t, 729 bus_space_handle_t bsh, 730 bus_size_t offset, 731 const u_int16_t * addr, 732 size_t count) 733{ 734 bus_addr_t baddr = (bus_addr_t) bsh + offset; 735 736 while (count--) { 737 (*(volatile u_int16_t *)(baddr)) = *addr; 738 addr++; 739 baddr += 2; 740 } 741} 742 743void 744rmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh, 745 bus_size_t offset, const u_int32_t * addr, size_t count) 746{ 747 bus_addr_t baddr = bsh + offset; 748 749 while (count--) { 750 (*(volatile u_int32_t *)(baddr)) = *addr; 751 addr++; 752 baddr += 4; 753 } 754} 755 756static void 757rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 758 bus_size_t offset __unused, bus_size_t len __unused, int flags) 759{ 760 761} 762/*- 763 * Copyright (c) 2009 RMI Corporation 764 * All rights reserved. 765 * 766 * Redistribution and use in source and binary forms, with or without 767 * modification, are permitted provided that the following conditions 768 * are met: 769 * 1. Redistributions of source code must retain the above copyright 770 * notice, this list of conditions and the following disclaimer. 771 * 2. Redistributions in binary form must reproduce the above copyright 772 * notice, this list of conditions and the following disclaimer in the 773 * documentation and/or other materials provided with the distribution. 774 * 775 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 776 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 777 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 778 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 779 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 780 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 781 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 782 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 783 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 784 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 785 * SUCH DAMAGE. 786 * 787 */ 788#include <sys/cdefs.h> 789__FBSDID("$FreeBSD: head/sys/mips/rmi/bus_space_rmi_pci.c 204136 2010-02-20 17:19:16Z rrs $"); 790 791#include <sys/param.h> 792#include <sys/systm.h> 793#include <sys/bus.h> 794#include <sys/kernel.h> 795#include <sys/endian.h> 796#include <sys/malloc.h> 797#include <sys/ktr.h> 798 799#include <vm/vm.h> 800#include <vm/pmap.h> 801#include <vm/vm_kern.h> 802#include <vm/vm_extern.h> 803 804#include <machine/bus.h> 805#include <machine/cache.h> 806 807static int 808rmi_pci_bus_space_map(void *t, bus_addr_t addr, 809 bus_size_t size, int flags, 810 bus_space_handle_t * bshp); 811 812static void 813rmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh, 814 bus_size_t size); 815 816static int 817rmi_pci_bus_space_subregion(void *t, 818 bus_space_handle_t bsh, 819 bus_size_t offset, bus_size_t size, 820 bus_space_handle_t * nbshp); 821 822static u_int8_t 823rmi_pci_bus_space_read_1(void *t, 824 bus_space_handle_t handle, 825 bus_size_t offset); 826 827static u_int16_t 828rmi_pci_bus_space_read_2(void *t, 829 bus_space_handle_t handle, 830 bus_size_t offset); 831 832static u_int32_t 833rmi_pci_bus_space_read_4(void *t, 834 bus_space_handle_t handle, 835 bus_size_t offset); 836 837static void 838rmi_pci_bus_space_read_multi_1(void *t, 839 bus_space_handle_t handle, 840 bus_size_t offset, u_int8_t * addr, 841 size_t count); 842 843static void 844rmi_pci_bus_space_read_multi_2(void *t, 845 bus_space_handle_t handle, 846 bus_size_t offset, u_int16_t * addr, 847 size_t count); 848 849static void 850rmi_pci_bus_space_read_multi_4(void *t, 851 bus_space_handle_t handle, 852 bus_size_t offset, u_int32_t * addr, 853 size_t count); 854 855static void 856rmi_pci_bus_space_read_region_1(void *t, 857 bus_space_handle_t bsh, 858 bus_size_t offset, u_int8_t * addr, 859 size_t count); 860 861static void 862rmi_pci_bus_space_read_region_2(void *t, 863 bus_space_handle_t bsh, 864 bus_size_t offset, u_int16_t * addr, 865 size_t count); 866 867static void 868rmi_pci_bus_space_read_region_4(void *t, 869 bus_space_handle_t bsh, 870 bus_size_t offset, u_int32_t * addr, 871 size_t count); 872 873static void 874rmi_pci_bus_space_write_1(void *t, 875 bus_space_handle_t handle, 876 bus_size_t offset, u_int8_t value); 877 878static void 879rmi_pci_bus_space_write_2(void *t, 880 bus_space_handle_t handle, 881 bus_size_t offset, u_int16_t value); 882 883static void 884rmi_pci_bus_space_write_4(void *t, 885 bus_space_handle_t handle, 886 bus_size_t offset, u_int32_t value); 887 888static void 889rmi_pci_bus_space_write_multi_1(void *t, 890 bus_space_handle_t handle, 891 bus_size_t offset, 892 const u_int8_t * addr, 893 size_t count); 894 895static void 896rmi_pci_bus_space_write_multi_2(void *t, 897 bus_space_handle_t handle, 898 bus_size_t offset, 899 const u_int16_t * addr, 900 size_t count); 901 902static void 903rmi_pci_bus_space_write_multi_4(void *t, 904 bus_space_handle_t handle, 905 bus_size_t offset, 906 const u_int32_t * addr, 907 size_t count); 908 909static void 910rmi_pci_bus_space_write_region_2(void *t, 911 bus_space_handle_t bsh, 912 bus_size_t offset, 913 const u_int16_t * addr, 914 size_t count); 915 916static void 917rmi_pci_bus_space_write_region_4(void *t, 918 bus_space_handle_t bsh, 919 bus_size_t offset, 920 const u_int32_t * addr, 921 size_t count); 922 923 924static void 925rmi_pci_bus_space_set_region_2(void *t, 926 bus_space_handle_t bsh, 927 bus_size_t offset, u_int16_t value, 928 size_t count); 929static void 930rmi_pci_bus_space_set_region_4(void *t, 931 bus_space_handle_t bsh, 932 bus_size_t offset, u_int32_t value, 933 size_t count); 934 935static void 936rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 937 bus_size_t offset __unused, bus_size_t len __unused, int flags); 938 939static void 940rmi_pci_bus_space_copy_region_2(void *t, 941 bus_space_handle_t bsh1, 942 bus_size_t off1, 943 bus_space_handle_t bsh2, 944 bus_size_t off2, size_t count); 945 946u_int8_t 947rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 948 bus_size_t offset); 949 950static u_int16_t 951rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 952 bus_size_t offset); 953 954static u_int32_t 955rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 956 bus_size_t offset); 957static void 958rmi_pci_bus_space_read_multi_stream_1(void *t, 959 bus_space_handle_t handle, 960 bus_size_t offset, u_int8_t * addr, 961 size_t count); 962 963static void 964rmi_pci_bus_space_read_multi_stream_2(void *t, 965 bus_space_handle_t handle, 966 bus_size_t offset, u_int16_t * addr, 967 size_t count); 968 969static void 970rmi_pci_bus_space_read_multi_stream_4(void *t, 971 bus_space_handle_t handle, 972 bus_size_t offset, u_int32_t * addr, 973 size_t count); 974 975void 976rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, 977 bus_size_t offset, u_int8_t value); 978static void 979rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 980 bus_size_t offset, u_int16_t value); 981 982static void 983rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 984 bus_size_t offset, u_int32_t value); 985 986static void 987rmi_pci_bus_space_write_multi_stream_1(void *t, 988 bus_space_handle_t handle, 989 bus_size_t offset, 990 const u_int8_t * addr, 991 size_t count); 992static void 993rmi_pci_bus_space_write_multi_stream_2(void *t, 994 bus_space_handle_t handle, 995 bus_size_t offset, 996 const u_int16_t * addr, 997 size_t count); 998 999static void 1000rmi_pci_bus_space_write_multi_stream_4(void *t, 1001 bus_space_handle_t handle, 1002 bus_size_t offset, 1003 const u_int32_t * addr, 1004 size_t count); 1005 1006#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__) 1007 1008static struct bus_space local_rmi_pci_bus_space = { 1009 /* cookie */ 1010 (void *)0, 1011 1012 /* mapping/unmapping */ 1013 rmi_pci_bus_space_map, 1014 rmi_pci_bus_space_unmap, 1015 rmi_pci_bus_space_subregion, 1016 1017 /* allocation/deallocation */ 1018 NULL, 1019 NULL, 1020 1021 /* barrier */ 1022 rmi_pci_bus_space_barrier, 1023 1024 /* read (single) */ 1025 rmi_pci_bus_space_read_1, 1026 rmi_pci_bus_space_read_2, 1027 rmi_pci_bus_space_read_4, 1028 NULL, 1029 1030 /* read multiple */ 1031 rmi_pci_bus_space_read_multi_1, 1032 rmi_pci_bus_space_read_multi_2, 1033 rmi_pci_bus_space_read_multi_4, 1034 NULL, 1035 1036 /* read region */ 1037 rmi_pci_bus_space_read_region_1, 1038 rmi_pci_bus_space_read_region_2, 1039 rmi_pci_bus_space_read_region_4, 1040 NULL, 1041 1042 /* write (single) */ 1043 rmi_pci_bus_space_write_1, 1044 rmi_pci_bus_space_write_2, 1045 rmi_pci_bus_space_write_4, 1046 NULL, 1047 1048 /* write multiple */ 1049 rmi_pci_bus_space_write_multi_1, 1050 rmi_pci_bus_space_write_multi_2, 1051 rmi_pci_bus_space_write_multi_4, 1052 NULL, 1053 1054 /* write region */ 1055 NULL, 1056 rmi_pci_bus_space_write_region_2, 1057 rmi_pci_bus_space_write_region_4, 1058 NULL, 1059 1060 /* set multiple */ 1061 NULL, 1062 NULL, 1063 NULL, 1064 NULL, 1065 1066 /* set region */ 1067 NULL, 1068 rmi_pci_bus_space_set_region_2, 1069 rmi_pci_bus_space_set_region_4, 1070 NULL, 1071 1072 /* copy */ 1073 NULL, 1074 rmi_pci_bus_space_copy_region_2, 1075 NULL, 1076 NULL, 1077 1078 /* read (single) stream */ 1079 rmi_pci_bus_space_read_stream_1, 1080 rmi_pci_bus_space_read_stream_2, 1081 rmi_pci_bus_space_read_stream_4, 1082 NULL, 1083 1084 /* read multiple stream */ 1085 rmi_pci_bus_space_read_multi_stream_1, 1086 rmi_pci_bus_space_read_multi_stream_2, 1087 rmi_pci_bus_space_read_multi_stream_4, 1088 NULL, 1089 1090 /* read region stream */ 1091 rmi_pci_bus_space_read_region_1, 1092 rmi_pci_bus_space_read_region_2, 1093 rmi_pci_bus_space_read_region_4, 1094 NULL, 1095 1096 /* write (single) stream */ 1097 rmi_pci_bus_space_write_stream_1, 1098 rmi_pci_bus_space_write_stream_2, 1099 rmi_pci_bus_space_write_stream_4, 1100 NULL, 1101 1102 /* write multiple stream */ 1103 rmi_pci_bus_space_write_multi_stream_1, 1104 rmi_pci_bus_space_write_multi_stream_2, 1105 rmi_pci_bus_space_write_multi_stream_4, 1106 NULL, 1107 1108 /* write region stream */ 1109 NULL, 1110 rmi_pci_bus_space_write_region_2, 1111 rmi_pci_bus_space_write_region_4, 1112 NULL, 1113}; 1114 1115/* generic bus_space tag */ 1116bus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space; 1117 1118/* 1119 * Map a region of device bus space into CPU virtual address space. 1120 */ 1121static int 1122rmi_pci_bus_space_map(void *t __unused, bus_addr_t addr, 1123 bus_size_t size __unused, int flags __unused, 1124 bus_space_handle_t * bshp) 1125{ 1126 *bshp = addr; 1127 return (0); 1128} 1129 1130/* 1131 * Unmap a region of device bus space. 1132 */ 1133static void 1134rmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, 1135 bus_size_t size __unused) 1136{ 1137} 1138 1139/* 1140 * Get a new handle for a subregion of an already-mapped area of bus space. 1141 */ 1142 1143static int 1144rmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, 1145 bus_size_t offset, bus_size_t size __unused, 1146 bus_space_handle_t * nbshp) 1147{ 1148 *nbshp = bsh + offset; 1149 return (0); 1150} 1151 1152/* 1153 * Read a 1, 2, 4, or 8 byte quantity from bus space 1154 * described by tag/handle/offset. 1155 */ 1156 1157static u_int8_t 1158rmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle, 1159 bus_size_t offset) 1160{ 1161 return (u_int8_t) (*(volatile u_int8_t *)(handle + offset)); 1162} 1163 1164static u_int16_t 1165rmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle, 1166 bus_size_t offset) 1167{ 1168 return bswap16((u_int16_t) (*(volatile u_int16_t *)(handle + offset))); 1169} 1170 1171static u_int32_t 1172rmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle, 1173 bus_size_t offset) 1174{ 1175 return bswap32((*(volatile u_int32_t *)(handle + offset))); 1176} 1177 1178 1179/* 1180 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 1181 * described by tag/handle/offset and copy into buffer provided. 1182 */ 1183static void 1184rmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, 1185 bus_size_t offset, u_int8_t * addr, size_t count) 1186{ 1187 while (count--) { 1188 *addr = (*(volatile u_int8_t *)(handle + offset)); 1189 addr++; 1190 } 1191} 1192 1193static void 1194rmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, 1195 bus_size_t offset, u_int16_t * addr, size_t count) 1196{ 1197 1198 while (count--) { 1199 *addr = *(volatile u_int16_t *)(handle + offset); 1200 *addr = bswap16(*addr); 1201 addr++; 1202 } 1203} 1204 1205static void 1206rmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, 1207 bus_size_t offset, u_int32_t * addr, size_t count) 1208{ 1209 1210 while (count--) { 1211 *addr = *(volatile u_int32_t *)(handle + offset); 1212 *addr = bswap32(*addr); 1213 addr++; 1214 } 1215} 1216 1217/* 1218 * Write the 1, 2, 4, or 8 byte value `value' to bus space 1219 * described by tag/handle/offset. 1220 */ 1221 1222static void 1223rmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle, 1224 bus_size_t offset, u_int8_t value) 1225{ 1226 mips_sync(); 1227 *(volatile u_int8_t *)(handle + offset) = value; 1228} 1229 1230static void 1231rmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle, 1232 bus_size_t offset, u_int16_t value) 1233{ 1234 mips_sync(); 1235 *(volatile u_int16_t *)(handle + offset) = bswap16(value); 1236} 1237 1238 1239static void 1240rmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle, 1241 bus_size_t offset, u_int32_t value) 1242{ 1243 mips_sync(); 1244 *(volatile u_int32_t *)(handle + offset) = bswap32(value); 1245} 1246 1247/* 1248 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 1249 * provided to bus space described by tag/handle/offset. 1250 */ 1251 1252 1253static void 1254rmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, 1255 bus_size_t offset, const u_int8_t * addr, size_t count) 1256{ 1257 mips_sync(); 1258 while (count--) { 1259 (*(volatile u_int8_t *)(handle + offset)) = *addr; 1260 addr++; 1261 } 1262} 1263 1264static void 1265rmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, 1266 bus_size_t offset, const u_int16_t * addr, size_t count) 1267{ 1268 mips_sync(); 1269 while (count--) { 1270 (*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr); 1271 addr++; 1272 } 1273} 1274 1275static void 1276rmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, 1277 bus_size_t offset, const u_int32_t * addr, size_t count) 1278{ 1279 mips_sync(); 1280 while (count--) { 1281 (*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr); 1282 addr++; 1283 } 1284} 1285 1286/* 1287 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 1288 * by tag/handle starting at `offset'. 1289 */ 1290 1291static void 1292rmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh, 1293 bus_size_t offset, u_int16_t value, size_t count) 1294{ 1295 bus_addr_t addr = bsh + offset; 1296 1297 for (; count != 0; count--, addr += 2) 1298 (*(volatile u_int16_t *)(addr)) = value; 1299} 1300 1301static void 1302rmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh, 1303 bus_size_t offset, u_int32_t value, size_t count) 1304{ 1305 bus_addr_t addr = bsh + offset; 1306 1307 for (; count != 0; count--, addr += 4) 1308 (*(volatile u_int32_t *)(addr)) = value; 1309} 1310 1311 1312/* 1313 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 1314 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 1315 */ 1316static void 1317rmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, 1318 bus_size_t off1, bus_space_handle_t bsh2, 1319 bus_size_t off2, size_t count) 1320{ 1321 TODO(); 1322} 1323 1324/* 1325 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 1326 * described by tag/handle/offset and copy into buffer provided. 1327 */ 1328 1329u_int8_t 1330rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 1331 bus_size_t offset) 1332{ 1333 1334 return *((volatile u_int8_t *)(handle + offset)); 1335} 1336 1337 1338static u_int16_t 1339rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 1340 bus_size_t offset) 1341{ 1342 return *(volatile u_int16_t *)(handle + offset); 1343} 1344 1345 1346static u_int32_t 1347rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 1348 bus_size_t offset) 1349{ 1350 return (*(volatile u_int32_t *)(handle + offset)); 1351} 1352 1353 1354static void 1355rmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, 1356 bus_size_t offset, u_int8_t * addr, size_t count) 1357{ 1358 while (count--) { 1359 *addr = (*(volatile u_int8_t *)(handle + offset)); 1360 addr++; 1361 } 1362} 1363 1364static void 1365rmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, 1366 bus_size_t offset, u_int16_t * addr, size_t count) 1367{ 1368 while (count--) { 1369 *addr = (*(volatile u_int16_t *)(handle + offset)); 1370 addr++; 1371 } 1372} 1373 1374static void 1375rmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, 1376 bus_size_t offset, u_int32_t * addr, size_t count) 1377{ 1378 while (count--) { 1379 *addr = (*(volatile u_int32_t *)(handle + offset)); 1380 addr++; 1381 } 1382} 1383 1384 1385 1386/* 1387 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 1388 * described by tag/handle and starting at `offset' and copy into 1389 * buffer provided. 1390 */ 1391void 1392rmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh, 1393 bus_size_t offset, u_int8_t * addr, size_t count) 1394{ 1395 bus_addr_t baddr = bsh + offset; 1396 1397 while (count--) { 1398 *addr++ = (*(volatile u_int8_t *)(baddr)); 1399 baddr += 1; 1400 } 1401} 1402 1403void 1404rmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh, 1405 bus_size_t offset, u_int16_t * addr, size_t count) 1406{ 1407 bus_addr_t baddr = bsh + offset; 1408 1409 while (count--) { 1410 *addr++ = (*(volatile u_int16_t *)(baddr)); 1411 baddr += 2; 1412 } 1413} 1414 1415void 1416rmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh, 1417 bus_size_t offset, u_int32_t * addr, size_t count) 1418{ 1419 bus_addr_t baddr = bsh + offset; 1420 1421 while (count--) { 1422 *addr++ = (*(volatile u_int32_t *)(baddr)); 1423 baddr += 4; 1424 } 1425} 1426 1427 1428void 1429rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle, 1430 bus_size_t offset, u_int8_t value) 1431{ 1432 mips_sync(); 1433 *(volatile u_int8_t *)(handle + offset) = value; 1434} 1435 1436static void 1437rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 1438 bus_size_t offset, u_int16_t value) 1439{ 1440 mips_sync(); 1441 *(volatile u_int16_t *)(handle + offset) = value; 1442} 1443 1444 1445static void 1446rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 1447 bus_size_t offset, u_int32_t value) 1448{ 1449 mips_sync(); 1450 *(volatile u_int32_t *)(handle + offset) = value; 1451} 1452 1453 1454static void 1455rmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, 1456 bus_size_t offset, const u_int8_t * addr, size_t count) 1457{ 1458 mips_sync(); 1459 while (count--) { 1460 (*(volatile u_int8_t *)(handle + offset)) = *addr; 1461 addr++; 1462 } 1463} 1464 1465static void 1466rmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, 1467 bus_size_t offset, const u_int16_t * addr, size_t count) 1468{ 1469 mips_sync(); 1470 while (count--) { 1471 (*(volatile u_int16_t *)(handle + offset)) = *addr; 1472 addr++; 1473 } 1474} 1475 1476static void 1477rmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, 1478 bus_size_t offset, const u_int32_t * addr, size_t count) 1479{ 1480 mips_sync(); 1481 while (count--) { 1482 (*(volatile u_int32_t *)(handle + offset)) = *addr; 1483 addr++; 1484 } 1485} 1486 1487void 1488rmi_pci_bus_space_write_region_2(void *t, 1489 bus_space_handle_t bsh, 1490 bus_size_t offset, 1491 const u_int16_t * addr, 1492 size_t count) 1493{ 1494 bus_addr_t baddr = (bus_addr_t) bsh + offset; 1495 1496 while (count--) { 1497 (*(volatile u_int16_t *)(baddr)) = *addr; 1498 addr++; 1499 baddr += 2; 1500 } 1501} 1502 1503void 1504rmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh, 1505 bus_size_t offset, const u_int32_t * addr, size_t count) 1506{ 1507 bus_addr_t baddr = bsh + offset; 1508 1509 while (count--) { 1510 (*(volatile u_int32_t *)(baddr)) = *addr; 1511 addr++; 1512 baddr += 4; 1513 } 1514} 1515 1516static void 1517rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 1518 bus_size_t offset __unused, bus_size_t len __unused, int flags) 1519{ 1520 1521} 1522