1/*- 2 * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights 3 * reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 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 13 * the documentation and/or other materials provided with the 14 * distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 26 * THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * NETLOGIC_BSD */ 29 30#include <sys/cdefs.h> 31__FBSDID("$FreeBSD$"); 32 33#include <sys/param.h> 34#include <sys/systm.h> 35#include <sys/bus.h> 36#include <sys/kernel.h> 37#include <sys/endian.h> 38#include <sys/malloc.h> 39#include <sys/ktr.h> 40 41#include <vm/vm.h> 42#include <vm/pmap.h> 43#include <vm/vm_kern.h> 44#include <vm/vm_extern.h> 45 46#include <machine/bus.h> 47#include <machine/cache.h> 48 49static int 50rmi_pci_bus_space_map(void *t, bus_addr_t addr, 51 bus_size_t size, int flags, 52 bus_space_handle_t * bshp); 53 54static void 55rmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh, 56 bus_size_t size); 57 58static int 59rmi_pci_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_pci_bus_space_read_1(void *t, 66 bus_space_handle_t handle, 67 bus_size_t offset); 68 69static u_int16_t 70rmi_pci_bus_space_read_2(void *t, 71 bus_space_handle_t handle, 72 bus_size_t offset); 73 74static u_int32_t 75rmi_pci_bus_space_read_4(void *t, 76 bus_space_handle_t handle, 77 bus_size_t offset); 78 79static void 80rmi_pci_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_pci_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_pci_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_pci_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_pci_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_pci_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_pci_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_pci_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_pci_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_pci_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); 136 137static void 138rmi_pci_bus_space_write_multi_2(void *t, 139 bus_space_handle_t handle, 140 bus_size_t offset, 141 const u_int16_t * addr, 142 size_t count); 143 144static void 145rmi_pci_bus_space_write_multi_4(void *t, 146 bus_space_handle_t handle, 147 bus_size_t offset, 148 const u_int32_t * addr, 149 size_t count); 150 151static void 152rmi_pci_bus_space_write_region_2(void *t, 153 bus_space_handle_t bsh, 154 bus_size_t offset, 155 const u_int16_t * addr, 156 size_t count); 157 158static void 159rmi_pci_bus_space_write_region_4(void *t, 160 bus_space_handle_t bsh, 161 bus_size_t offset, 162 const u_int32_t * addr, 163 size_t count); 164 165 166static void 167rmi_pci_bus_space_set_region_2(void *t, 168 bus_space_handle_t bsh, 169 bus_size_t offset, u_int16_t value, 170 size_t count); 171static void 172rmi_pci_bus_space_set_region_4(void *t, 173 bus_space_handle_t bsh, 174 bus_size_t offset, u_int32_t value, 175 size_t count); 176 177static void 178rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 179 bus_size_t offset __unused, bus_size_t len __unused, int flags); 180 181static void 182rmi_pci_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_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 190 bus_size_t offset); 191 192static u_int16_t 193rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 194 bus_size_t offset); 195 196static u_int32_t 197rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 198 bus_size_t offset); 199static void 200rmi_pci_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_pci_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_pci_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_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, 219 bus_size_t offset, u_int8_t value); 220static void 221rmi_pci_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_pci_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_pci_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_pci_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_pci_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#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__) 249 250static struct bus_space local_rmi_pci_bus_space = { 251 /* cookie */ 252 (void *)0, 253 254 /* mapping/unmapping */ 255 rmi_pci_bus_space_map, 256 rmi_pci_bus_space_unmap, 257 rmi_pci_bus_space_subregion, 258 259 /* allocation/deallocation */ 260 NULL, 261 NULL, 262 263 /* barrier */ 264 rmi_pci_bus_space_barrier, 265 266 /* read (single) */ 267 rmi_pci_bus_space_read_1, 268 rmi_pci_bus_space_read_2, 269 rmi_pci_bus_space_read_4, 270 NULL, 271 272 /* read multiple */ 273 rmi_pci_bus_space_read_multi_1, 274 rmi_pci_bus_space_read_multi_2, 275 rmi_pci_bus_space_read_multi_4, 276 NULL, 277 278 /* read region */ 279 rmi_pci_bus_space_read_region_1, 280 rmi_pci_bus_space_read_region_2, 281 rmi_pci_bus_space_read_region_4, 282 NULL, 283 284 /* write (single) */ 285 rmi_pci_bus_space_write_1, 286 rmi_pci_bus_space_write_2, 287 rmi_pci_bus_space_write_4, 288 NULL, 289 290 /* write multiple */ 291 rmi_pci_bus_space_write_multi_1, 292 rmi_pci_bus_space_write_multi_2, 293 rmi_pci_bus_space_write_multi_4, 294 NULL, 295 296 /* write region */ 297 NULL, 298 rmi_pci_bus_space_write_region_2, 299 rmi_pci_bus_space_write_region_4, 300 NULL, 301 302 /* set multiple */ 303 NULL, 304 NULL, 305 NULL, 306 NULL, 307 308 /* set region */ 309 NULL, 310 rmi_pci_bus_space_set_region_2, 311 rmi_pci_bus_space_set_region_4, 312 NULL, 313 314 /* copy */ 315 NULL, 316 rmi_pci_bus_space_copy_region_2, 317 NULL, 318 NULL, 319 320 /* read (single) stream */ 321 rmi_pci_bus_space_read_stream_1, 322 rmi_pci_bus_space_read_stream_2, 323 rmi_pci_bus_space_read_stream_4, 324 NULL, 325 326 /* read multiple stream */ 327 rmi_pci_bus_space_read_multi_stream_1, 328 rmi_pci_bus_space_read_multi_stream_2, 329 rmi_pci_bus_space_read_multi_stream_4, 330 NULL, 331 332 /* read region stream */ 333 rmi_pci_bus_space_read_region_1, 334 rmi_pci_bus_space_read_region_2, 335 rmi_pci_bus_space_read_region_4, 336 NULL, 337 338 /* write (single) stream */ 339 rmi_pci_bus_space_write_stream_1, 340 rmi_pci_bus_space_write_stream_2, 341 rmi_pci_bus_space_write_stream_4, 342 NULL, 343 344 /* write multiple stream */ 345 rmi_pci_bus_space_write_multi_stream_1, 346 rmi_pci_bus_space_write_multi_stream_2, 347 rmi_pci_bus_space_write_multi_stream_4, 348 NULL, 349 350 /* write region stream */ 351 NULL, 352 rmi_pci_bus_space_write_region_2, 353 rmi_pci_bus_space_write_region_4, 354 NULL, 355}; 356 357/* generic bus_space tag */ 358bus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space; 359 360/* 361 * Map a region of device bus space into CPU virtual address space. 362 */ 363static int 364rmi_pci_bus_space_map(void *t __unused, bus_addr_t addr, 365 bus_size_t size __unused, int flags __unused, 366 bus_space_handle_t * bshp) 367{ 368 *bshp = addr; 369 return (0); 370} 371 372/* 373 * Unmap a region of device bus space. 374 */ 375static void 376rmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, 377 bus_size_t size __unused) 378{ 379} 380 381/* 382 * Get a new handle for a subregion of an already-mapped area of bus space. 383 */ 384 385static int 386rmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, 387 bus_size_t offset, bus_size_t size __unused, 388 bus_space_handle_t * nbshp) 389{ 390 *nbshp = bsh + offset; 391 return (0); 392} 393 394/* 395 * Read a 1, 2, 4, or 8 byte quantity from bus space 396 * described by tag/handle/offset. 397 */ 398 399static u_int8_t 400rmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle, 401 bus_size_t offset) 402{ 403 return (u_int8_t) (*(volatile u_int8_t *)(handle + offset)); 404} 405 406static u_int16_t 407rmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle, 408 bus_size_t offset) 409{ 410 u_int16_t value; 411 412 value = *(volatile u_int16_t *)(handle + offset); 413 return bswap16(value); 414} 415 416static u_int32_t 417rmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle, 418 bus_size_t offset) 419{ 420 uint32_t value; 421 422 value = *(volatile u_int32_t *)(handle + offset); 423 return bswap32(value); 424} 425 426/* 427 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 428 * described by tag/handle/offset and copy into buffer provided. 429 */ 430static void 431rmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, 432 bus_size_t offset, u_int8_t * addr, size_t count) 433{ 434 while (count--) { 435 *addr = *(volatile u_int8_t *)(handle + offset); 436 addr++; 437 } 438} 439 440static void 441rmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, 442 bus_size_t offset, u_int16_t * addr, size_t count) 443{ 444 445 while (count--) { 446 *addr = *(volatile u_int16_t *)(handle + offset); 447 *addr = bswap16(*addr); 448 addr++; 449 } 450} 451 452static void 453rmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, 454 bus_size_t offset, u_int32_t * addr, size_t count) 455{ 456 457 while (count--) { 458 *addr = *(volatile u_int32_t *)(handle + offset); 459 *addr = bswap32(*addr); 460 addr++; 461 } 462} 463 464/* 465 * Write the 1, 2, 4, or 8 byte value `value' to bus space 466 * described by tag/handle/offset. 467 */ 468 469static void 470rmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle, 471 bus_size_t offset, u_int8_t value) 472{ 473 mips_sync(); 474 *(volatile u_int8_t *)(handle + offset) = value; 475} 476 477static void 478rmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle, 479 bus_size_t offset, u_int16_t value) 480{ 481 mips_sync(); 482 *(volatile u_int16_t *)(handle + offset) = bswap16(value); 483} 484 485 486static void 487rmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle, 488 bus_size_t offset, u_int32_t value) 489{ 490 mips_sync(); 491 *(volatile u_int32_t *)(handle + offset) = bswap32(value); 492} 493 494/* 495 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 496 * provided to bus space described by tag/handle/offset. 497 */ 498 499 500static void 501rmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, 502 bus_size_t offset, const u_int8_t * addr, size_t count) 503{ 504 mips_sync(); 505 while (count--) { 506 (*(volatile u_int8_t *)(handle + offset)) = *addr; 507 addr++; 508 } 509} 510 511static void 512rmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, 513 bus_size_t offset, const u_int16_t * addr, size_t count) 514{ 515 mips_sync(); 516 while (count--) { 517 (*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr); 518 addr++; 519 } 520} 521 522static void 523rmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, 524 bus_size_t offset, const u_int32_t * addr, size_t count) 525{ 526 mips_sync(); 527 while (count--) { 528 (*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr); 529 addr++; 530 } 531} 532 533/* 534 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 535 * by tag/handle starting at `offset'. 536 */ 537 538static void 539rmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh, 540 bus_size_t offset, u_int16_t value, size_t count) 541{ 542 bus_addr_t addr = bsh + offset; 543 544 for (; count != 0; count--, addr += 2) 545 (*(volatile u_int16_t *)(addr)) = value; 546} 547 548static void 549rmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh, 550 bus_size_t offset, u_int32_t value, size_t count) 551{ 552 bus_addr_t addr = bsh + offset; 553 554 for (; count != 0; count--, addr += 4) 555 (*(volatile u_int32_t *)(addr)) = value; 556} 557 558 559/* 560 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 561 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 562 */ 563static void 564rmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, 565 bus_size_t off1, bus_space_handle_t bsh2, 566 bus_size_t off2, size_t count) 567{ 568 TODO(); 569} 570 571/* 572 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 573 * described by tag/handle/offset and copy into buffer provided. 574 */ 575 576u_int8_t 577rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 578 bus_size_t offset) 579{ 580 581 return *((volatile u_int8_t *)(handle + offset)); 582} 583 584 585static u_int16_t 586rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 587 bus_size_t offset) 588{ 589 return *(volatile u_int16_t *)(handle + offset); 590} 591 592 593static u_int32_t 594rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 595 bus_size_t offset) 596{ 597 return (*(volatile u_int32_t *)(handle + offset)); 598} 599 600 601static void 602rmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, 603 bus_size_t offset, u_int8_t * addr, size_t count) 604{ 605 while (count--) { 606 *addr = (*(volatile u_int8_t *)(handle + offset)); 607 addr++; 608 } 609} 610 611static void 612rmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, 613 bus_size_t offset, u_int16_t * addr, size_t count) 614{ 615 while (count--) { 616 *addr = (*(volatile u_int16_t *)(handle + offset)); 617 addr++; 618 } 619} 620 621static void 622rmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, 623 bus_size_t offset, u_int32_t * addr, size_t count) 624{ 625 while (count--) { 626 *addr = (*(volatile u_int32_t *)(handle + offset)); 627 addr++; 628 } 629} 630 631 632 633/* 634 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 635 * described by tag/handle and starting at `offset' and copy into 636 * buffer provided. 637 */ 638void 639rmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh, 640 bus_size_t offset, u_int8_t * addr, size_t count) 641{ 642 bus_addr_t baddr = bsh + offset; 643 644 while (count--) { 645 *addr++ = (*(volatile u_int8_t *)(baddr)); 646 baddr += 1; 647 } 648} 649 650void 651rmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh, 652 bus_size_t offset, u_int16_t * addr, size_t count) 653{ 654 bus_addr_t baddr = bsh + offset; 655 656 while (count--) { 657 *addr++ = (*(volatile u_int16_t *)(baddr)); 658 baddr += 2; 659 } 660} 661 662void 663rmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh, 664 bus_size_t offset, u_int32_t * addr, size_t count) 665{ 666 bus_addr_t baddr = bsh + offset; 667 668 while (count--) { 669 *addr++ = (*(volatile u_int32_t *)(baddr)); 670 baddr += 4; 671 } 672} 673 674 675void 676rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle, 677 bus_size_t offset, u_int8_t value) 678{ 679 mips_sync(); 680 *(volatile u_int8_t *)(handle + offset) = value; 681} 682 683static void 684rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 685 bus_size_t offset, u_int16_t value) 686{ 687 mips_sync(); 688 *(volatile u_int16_t *)(handle + offset) = value; 689} 690 691 692static void 693rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 694 bus_size_t offset, u_int32_t value) 695{ 696 mips_sync(); 697 *(volatile u_int32_t *)(handle + offset) = value; 698} 699 700 701static void 702rmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, 703 bus_size_t offset, const u_int8_t * addr, size_t count) 704{ 705 mips_sync(); 706 while (count--) { 707 (*(volatile u_int8_t *)(handle + offset)) = *addr; 708 addr++; 709 } 710} 711 712static void 713rmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, 714 bus_size_t offset, const u_int16_t * addr, size_t count) 715{ 716 mips_sync(); 717 while (count--) { 718 (*(volatile u_int16_t *)(handle + offset)) = *addr; 719 addr++; 720 } 721} 722 723static void 724rmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, 725 bus_size_t offset, const u_int32_t * addr, size_t count) 726{ 727 mips_sync(); 728 while (count--) { 729 (*(volatile u_int32_t *)(handle + offset)) = *addr; 730 addr++; 731 } 732} 733 734void 735rmi_pci_bus_space_write_region_2(void *t, 736 bus_space_handle_t bsh, 737 bus_size_t offset, 738 const u_int16_t * addr, 739 size_t count) 740{ 741 bus_addr_t baddr = (bus_addr_t) bsh + offset; 742 743 while (count--) { 744 (*(volatile u_int16_t *)(baddr)) = *addr; 745 addr++; 746 baddr += 2; 747 } 748} 749 750void 751rmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh, 752 bus_size_t offset, const u_int32_t * addr, size_t count) 753{ 754 bus_addr_t baddr = bsh + offset; 755 756 while (count--) { 757 (*(volatile u_int32_t *)(baddr)) = *addr; 758 addr++; 759 baddr += 4; 760 } 761} 762 763static void 764rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 765 bus_size_t offset __unused, bus_size_t len __unused, int flags) 766{ 767 768} 769