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_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_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); 136 137static void 138rmi_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_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_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_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_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_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_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_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#define TODO() printf("XLP bus space: '%s' unimplemented\n", __func__) 249 250static struct bus_space local_rmi_bus_space = { 251 /* cookie */ 252 (void *)0, 253 254 /* mapping/unmapping */ 255 rmi_bus_space_map, 256 rmi_bus_space_unmap, 257 rmi_bus_space_subregion, 258 259 /* allocation/deallocation */ 260 NULL, 261 NULL, 262 263 /* barrier */ 264 rmi_bus_space_barrier, 265 266 /* read (single) */ 267 rmi_bus_space_read_1, 268 rmi_bus_space_read_2, 269 rmi_bus_space_read_4, 270 NULL, 271 272 /* read multiple */ 273 rmi_bus_space_read_multi_1, 274 rmi_bus_space_read_multi_2, 275 rmi_bus_space_read_multi_4, 276 NULL, 277 278 /* read region */ 279 rmi_bus_space_read_region_1, 280 rmi_bus_space_read_region_2, 281 rmi_bus_space_read_region_4, 282 NULL, 283 284 /* write (single) */ 285 rmi_bus_space_write_1, 286 rmi_bus_space_write_2, 287 rmi_bus_space_write_4, 288 NULL, 289 290 /* write multiple */ 291 rmi_bus_space_write_multi_1, 292 rmi_bus_space_write_multi_2, 293 rmi_bus_space_write_multi_4, 294 NULL, 295 296 /* write region */ 297 NULL, 298 rmi_bus_space_write_region_2, 299 rmi_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_bus_space_set_region_2, 311 rmi_bus_space_set_region_4, 312 NULL, 313 314 /* copy */ 315 NULL, 316 rmi_bus_space_copy_region_2, 317 NULL, 318 NULL, 319 320 /* read (single) stream */ 321 rmi_bus_space_read_stream_1, 322 rmi_bus_space_read_stream_2, 323 rmi_bus_space_read_stream_4, 324 NULL, 325 326 /* read multiple stream */ 327 rmi_bus_space_read_multi_stream_1, 328 rmi_bus_space_read_multi_stream_2, 329 rmi_bus_space_read_multi_stream_4, 330 NULL, 331 332 /* read region stream */ 333 rmi_bus_space_read_region_1, 334 rmi_bus_space_read_region_2, 335 rmi_bus_space_read_region_4, 336 NULL, 337 338 /* write (single) stream */ 339 rmi_bus_space_write_stream_1, 340 rmi_bus_space_write_stream_2, 341 rmi_bus_space_write_stream_4, 342 NULL, 343 344 /* write multiple stream */ 345 rmi_bus_space_write_multi_stream_1, 346 rmi_bus_space_write_multi_stream_2, 347 rmi_bus_space_write_multi_stream_4, 348 NULL, 349 350 /* write region stream */ 351 NULL, 352 rmi_bus_space_write_region_2, 353 rmi_bus_space_write_region_4, 354 NULL, 355}; 356 357/* generic bus_space tag */ 358bus_space_tag_t rmi_bus_space = &local_rmi_bus_space; 359 360/* 361 * Map a region of device bus space into CPU virtual address space. 362 */ 363static int 364rmi_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 369 *bshp = MIPS_PHYS_TO_DIRECT_UNCACHED(addr); 370 return (0); 371} 372 373/* 374 * Unmap a region of device bus space. 375 */ 376static void 377rmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, 378 bus_size_t size __unused) 379{ 380} 381 382/* 383 * Get a new handle for a subregion of an already-mapped area of bus space. 384 */ 385 386static int 387rmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, 388 bus_size_t offset, bus_size_t size __unused, 389 bus_space_handle_t *nbshp) 390{ 391 *nbshp = bsh + offset; 392 return (0); 393} 394 395/* 396 * Read a 1, 2, 4, or 8 byte quantity from bus space 397 * described by tag/handle/offset. 398 */ 399 400static u_int8_t 401rmi_bus_space_read_1(void *tag, bus_space_handle_t handle, 402 bus_size_t offset) 403{ 404 return (u_int8_t) (*(volatile u_int8_t *)(handle + offset)); 405} 406 407static u_int16_t 408rmi_bus_space_read_2(void *tag, bus_space_handle_t handle, 409 bus_size_t offset) 410{ 411 return (u_int16_t)(*(volatile u_int16_t *)(handle + offset)); 412} 413 414static u_int32_t 415rmi_bus_space_read_4(void *tag, bus_space_handle_t handle, 416 bus_size_t offset) 417{ 418 return (*(volatile u_int32_t *)(handle + offset)); 419} 420 421 422/* 423 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 424 * described by tag/handle/offset and copy into buffer provided. 425 */ 426static void 427rmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, 428 bus_size_t offset, u_int8_t *addr, size_t count) 429{ 430 TODO(); 431} 432 433static void 434rmi_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 TODO(); 438} 439 440static void 441rmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, 442 bus_size_t offset, u_int32_t *addr, size_t count) 443{ 444 TODO(); 445} 446 447/* 448 * Write the 1, 2, 4, or 8 byte value `value' to bus space 449 * described by tag/handle/offset. 450 */ 451 452static void 453rmi_bus_space_write_1(void *tag, bus_space_handle_t handle, 454 bus_size_t offset, u_int8_t value) 455{ 456 *(volatile u_int8_t *)(handle + offset) = value; 457} 458 459static void 460rmi_bus_space_write_2(void *tag, bus_space_handle_t handle, 461 bus_size_t offset, u_int16_t value) 462{ 463 *(volatile u_int16_t *)(handle + offset) = value; 464} 465 466static void 467rmi_bus_space_write_4(void *tag, bus_space_handle_t handle, 468 bus_size_t offset, u_int32_t value) 469{ 470 *(volatile u_int32_t *)(handle + offset) = value; 471} 472 473 474/* 475 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 476 * provided to bus space described by tag/handle/offset. 477 */ 478 479 480static void 481rmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, 482 bus_size_t offset, const u_int8_t *addr, size_t count) 483{ 484 TODO(); 485} 486 487static void 488rmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, 489 bus_size_t offset, const u_int16_t *addr, size_t count) 490{ 491 TODO(); 492} 493 494static void 495rmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, 496 bus_size_t offset, const u_int32_t *addr, size_t count) 497{ 498 TODO(); 499} 500 501/* 502 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 503 * by tag/handle starting at `offset'. 504 */ 505 506static void 507rmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh, 508 bus_size_t offset, u_int16_t value, size_t count) 509{ 510 bus_addr_t addr = bsh + offset; 511 512 for (; count != 0; count--, addr += 2) 513 (*(volatile u_int32_t *)(addr)) = value; 514} 515 516static void 517rmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh, 518 bus_size_t offset, u_int32_t value, size_t count) 519{ 520 bus_addr_t addr = bsh + offset; 521 522 for (; count != 0; count--, addr += 4) 523 (*(volatile u_int32_t *)(addr)) = value; 524} 525 526 527/* 528 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 529 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 530 */ 531static void 532rmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, 533 bus_size_t off1, bus_space_handle_t bsh2, 534 bus_size_t off2, size_t count) 535{ 536 printf("bus_space_copy_region_2 - unimplemented\n"); 537} 538 539/* 540 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 541 * described by tag/handle/offset and copy into buffer provided. 542 */ 543 544u_int8_t 545rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 546 bus_size_t offset) 547{ 548 549 return *((volatile u_int8_t *)(handle + offset)); 550} 551 552 553static u_int16_t 554rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 555 bus_size_t offset) 556{ 557 return *(volatile u_int16_t *)(handle + offset); 558} 559 560 561static u_int32_t 562rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 563 bus_size_t offset) 564{ 565 return (*(volatile u_int32_t *)(handle + offset)); 566} 567 568 569static void 570rmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, 571 bus_size_t offset, u_int8_t *addr, size_t count) 572{ 573 TODO(); 574} 575 576static void 577rmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, 578 bus_size_t offset, u_int16_t *addr, size_t count) 579{ 580 TODO(); 581} 582 583static void 584rmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, 585 bus_size_t offset, u_int32_t *addr, size_t count) 586{ 587 TODO(); 588} 589 590 591/* 592 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 593 * described by tag/handle and starting at `offset' and copy into 594 * buffer provided. 595 */ 596void 597rmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh, 598 bus_size_t offset, u_int8_t *addr, size_t count) 599{ 600 TODO(); 601} 602 603void 604rmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh, 605 bus_size_t offset, u_int16_t *addr, size_t count) 606{ 607 TODO(); 608} 609 610void 611rmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh, 612 bus_size_t offset, u_int32_t *addr, size_t count) 613{ 614 bus_addr_t baddr = bsh + offset; 615 616 while (count--) { 617 *addr++ = (*(volatile u_int32_t *)(baddr)); 618 baddr += 4; 619 } 620} 621 622void 623rmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle, 624 bus_size_t offset, u_int8_t value) 625{ 626 TODO(); 627} 628 629 630static void 631rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 632 bus_size_t offset, u_int16_t value) 633{ 634 TODO(); 635} 636 637 638static void 639rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 640 bus_size_t offset, u_int32_t value) 641{ 642 TODO(); 643} 644 645 646static void 647rmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, 648 bus_size_t offset, const u_int8_t *addr, size_t count) 649{ 650 TODO(); 651} 652 653static void 654rmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, 655 bus_size_t offset, const u_int16_t *addr, size_t count) 656{ 657 TODO(); 658} 659 660static void 661rmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, 662 bus_size_t offset, const u_int32_t *addr, size_t count) 663{ 664 TODO(); 665} 666 667void 668rmi_bus_space_write_region_2(void *t, 669 bus_space_handle_t bsh, 670 bus_size_t offset, 671 const u_int16_t *addr, 672 size_t count) 673{ 674 TODO(); 675} 676 677void 678rmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh, 679 bus_size_t offset, const u_int32_t *addr, size_t count) 680{ 681 TODO(); 682} 683 684static void 685rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 686 bus_size_t offset __unused, bus_size_t len __unused, int flags) 687{ 688} 689 690/* 691 * need a special bus space for this, because the Netlogic SoC 692 * UART allows only 32 bit access to its registers 693 */ 694 695static u_int8_t 696rmi_uart_bus_space_read_1(void *tag, bus_space_handle_t handle, 697 bus_size_t offset) 698{ 699 return (u_int8_t)(*(volatile u_int32_t *)(handle + offset)); 700} 701 702static void 703rmi_uart_bus_space_write_1(void *tag, bus_space_handle_t handle, 704 bus_size_t offset, u_int8_t value) 705{ 706 *(volatile u_int32_t *)(handle + offset) = value; 707} 708 709static struct bus_space local_rmi_uart_bus_space = { 710 /* cookie */ 711 (void *)0, 712 713 /* mapping/unmapping */ 714 rmi_bus_space_map, 715 rmi_bus_space_unmap, 716 rmi_bus_space_subregion, 717 718 /* allocation/deallocation */ 719 NULL, 720 NULL, 721 722 /* barrier */ 723 rmi_bus_space_barrier, 724 725 /* read (single) */ 726 rmi_uart_bus_space_read_1, NULL, NULL, NULL, 727 728 /* read multiple */ 729 NULL, NULL, NULL, NULL, 730 731 /* read region */ 732 NULL, NULL, NULL, NULL, 733 734 /* write (single) */ 735 rmi_uart_bus_space_write_1, NULL, NULL, NULL, 736 737 /* write multiple */ 738 NULL, NULL, NULL, NULL, 739 740 /* write region */ 741 NULL, NULL, NULL, NULL, 742 743 /* set multiple */ 744 NULL, NULL, NULL, NULL, 745 746 /* set region */ 747 NULL, NULL, NULL, NULL, 748 749 /* copy */ 750 NULL, NULL, NULL, NULL, 751 752 /* read (single) stream */ 753 NULL, NULL, NULL, NULL, 754 755 /* read multiple stream */ 756 NULL, NULL, NULL, NULL, 757 758 /* read region stream */ 759 NULL, NULL, NULL, NULL, 760 761 /* write (single) stream */ 762 NULL, NULL, NULL, NULL, 763 764 /* write multiple stream */ 765 NULL, NULL, NULL, NULL, 766 767 /* write region stream */ 768 NULL, NULL, NULL, NULL, 769}; 770 771/* generic bus_space tag */ 772bus_space_tag_t rmi_uart_bus_space = &local_rmi_uart_bus_space; 773