bus_space_rmi.c revision 302408
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: stable/11/sys/mips/rmi/bus_space_rmi.c 204131 2010-02-20 16:32:33Z rrs $ 27 */ 28#include <sys/cdefs.h> 29__FBSDID("$FreeBSD: stable/11/sys/mips/rmi/bus_space_rmi.c 204131 2010-02-20 16:32:33Z 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_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_bus_space_unmap(void *t, bus_space_handle_t bsh, 54 bus_size_t size); 55 56static int 57rmi_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_bus_space_read_1(void *t, 64 bus_space_handle_t handle, 65 bus_size_t offset); 66 67static u_int16_t 68rmi_bus_space_read_2(void *t, 69 bus_space_handle_t handle, 70 bus_size_t offset); 71 72static u_int32_t 73rmi_bus_space_read_4(void *t, 74 bus_space_handle_t handle, 75 bus_size_t offset); 76 77static void 78rmi_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_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_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_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_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_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_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_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_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_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_bus_space_write_multi_2(void *t, 137 bus_space_handle_t handle, 138 bus_size_t offset, 139 const u_int16_t * addr, 140 size_t count); 141 142static void 143rmi_bus_space_write_multi_4(void *t, 144 bus_space_handle_t handle, 145 bus_size_t offset, 146 const u_int32_t * addr, 147 size_t count); 148 149static void 150rmi_bus_space_write_region_2(void *t, 151 bus_space_handle_t bsh, 152 bus_size_t offset, 153 const u_int16_t * addr, 154 size_t count); 155 156static void 157rmi_bus_space_write_region_4(void *t, 158 bus_space_handle_t bsh, 159 bus_size_t offset, 160 const u_int32_t * addr, 161 size_t count); 162 163 164static void 165rmi_bus_space_set_region_2(void *t, 166 bus_space_handle_t bsh, 167 bus_size_t offset, u_int16_t value, 168 size_t count); 169static void 170rmi_bus_space_set_region_4(void *t, 171 bus_space_handle_t bsh, 172 bus_size_t offset, u_int32_t value, 173 size_t count); 174 175static void 176rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 177 bus_size_t offset __unused, bus_size_t len __unused, int flags); 178 179static void 180rmi_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_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 188 bus_size_t offset); 189 190static u_int16_t 191rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 192 bus_size_t offset); 193 194static u_int32_t 195rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 196 bus_size_t offset); 197static void 198rmi_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_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_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_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, 217 bus_size_t offset, u_int8_t value); 218static void 219rmi_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_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_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_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_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_bus_space = { 249 /* cookie */ 250 (void *)0, 251 252 /* mapping/unmapping */ 253 rmi_bus_space_map, 254 rmi_bus_space_unmap, 255 rmi_bus_space_subregion, 256 257 /* allocation/deallocation */ 258 NULL, 259 NULL, 260 261 /* barrier */ 262 rmi_bus_space_barrier, 263 264 /* read (single) */ 265 rmi_bus_space_read_1, 266 rmi_bus_space_read_2, 267 rmi_bus_space_read_4, 268 NULL, 269 270 /* read multiple */ 271 rmi_bus_space_read_multi_1, 272 rmi_bus_space_read_multi_2, 273 rmi_bus_space_read_multi_4, 274 NULL, 275 276 /* read region */ 277 rmi_bus_space_read_region_1, 278 rmi_bus_space_read_region_2, 279 rmi_bus_space_read_region_4, 280 NULL, 281 282 /* write (single) */ 283 rmi_bus_space_write_1, 284 rmi_bus_space_write_2, 285 rmi_bus_space_write_4, 286 NULL, 287 288 /* write multiple */ 289 rmi_bus_space_write_multi_1, 290 rmi_bus_space_write_multi_2, 291 rmi_bus_space_write_multi_4, 292 NULL, 293 294 /* write region */ 295 NULL, 296 rmi_bus_space_write_region_2, 297 rmi_bus_space_write_region_4, 298 NULL, 299 300 /* set multiple */ 301 NULL, 302 NULL, 303 NULL, 304 NULL, 305 306 /* set region */ 307 NULL, 308 rmi_bus_space_set_region_2, 309 rmi_bus_space_set_region_4, 310 NULL, 311 312 /* copy */ 313 NULL, 314 rmi_bus_space_copy_region_2, 315 NULL, 316 NULL, 317 318 /* read (single) stream */ 319 rmi_bus_space_read_stream_1, 320 rmi_bus_space_read_stream_2, 321 rmi_bus_space_read_stream_4, 322 NULL, 323 324 /* read multiple stream */ 325 rmi_bus_space_read_multi_stream_1, 326 rmi_bus_space_read_multi_stream_2, 327 rmi_bus_space_read_multi_stream_4, 328 NULL, 329 330 /* read region stream */ 331 rmi_bus_space_read_region_1, 332 rmi_bus_space_read_region_2, 333 rmi_bus_space_read_region_4, 334 NULL, 335 336 /* write (single) stream */ 337 rmi_bus_space_write_stream_1, 338 rmi_bus_space_write_stream_2, 339 rmi_bus_space_write_stream_4, 340 NULL, 341 342 /* write multiple stream */ 343 rmi_bus_space_write_multi_stream_1, 344 rmi_bus_space_write_multi_stream_2, 345 rmi_bus_space_write_multi_stream_4, 346 NULL, 347 348 /* write region stream */ 349 NULL, 350 rmi_bus_space_write_region_2, 351 rmi_bus_space_write_region_4, 352 NULL, 353}; 354 355/* generic bus_space tag */ 356bus_space_tag_t rmi_bus_space = &local_rmi_bus_space; 357 358/* 359 * Map a region of device bus space into CPU virtual address space. 360 */ 361static int 362rmi_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 367 *bshp = addr; 368 return (0); 369} 370 371/* 372 * Unmap a region of device bus space. 373 */ 374static void 375rmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, 376 bus_size_t size __unused) 377{ 378} 379 380/* 381 * Get a new handle for a subregion of an already-mapped area of bus space. 382 */ 383 384static int 385rmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, 386 bus_size_t offset, bus_size_t size __unused, 387 bus_space_handle_t * nbshp) 388{ 389 *nbshp = bsh + offset; 390 return (0); 391} 392 393/* 394 * Read a 1, 2, 4, or 8 byte quantity from bus space 395 * described by tag/handle/offset. 396 */ 397 398static u_int8_t 399rmi_bus_space_read_1(void *tag, bus_space_handle_t handle, 400 bus_size_t offset) 401{ 402 return (u_int8_t) (*(volatile u_int32_t *)(handle + offset)); 403} 404 405static u_int16_t 406rmi_bus_space_read_2(void *tag, bus_space_handle_t handle, 407 bus_size_t offset) 408{ 409 return (u_int16_t)(*(volatile u_int32_t *)(handle + offset)); 410} 411 412static u_int32_t 413rmi_bus_space_read_4(void *tag, bus_space_handle_t handle, 414 bus_size_t offset) 415{ 416 return (*(volatile u_int32_t *)(handle + offset)); 417} 418 419 420/* 421 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 422 * described by tag/handle/offset and copy into buffer provided. 423 */ 424static void 425rmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, 426 bus_size_t offset, u_int8_t * addr, size_t count) 427{ 428 TODO(); 429} 430 431static void 432rmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, 433 bus_size_t offset, u_int16_t * addr, size_t count) 434{ 435 TODO(); 436} 437 438static void 439rmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, 440 bus_size_t offset, u_int32_t * addr, size_t count) 441{ 442 TODO(); 443} 444 445/* 446 * Write the 1, 2, 4, or 8 byte value `value' to bus space 447 * described by tag/handle/offset. 448 */ 449 450static void 451rmi_bus_space_write_1(void *tag, bus_space_handle_t handle, 452 bus_size_t offset, u_int8_t value) 453{ 454 *(volatile u_int32_t *)(handle + offset) = (u_int32_t)value; 455} 456 457static void 458rmi_bus_space_write_2(void *tag, bus_space_handle_t handle, 459 bus_size_t offset, u_int16_t value) 460{ 461 *(volatile u_int32_t *)(handle + offset) = (u_int32_t)value; 462} 463 464static void 465rmi_bus_space_write_4(void *tag, bus_space_handle_t handle, 466 bus_size_t offset, u_int32_t value) 467{ 468 *(volatile u_int32_t *)(handle + offset) = value; 469} 470 471 472/* 473 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 474 * provided to bus space described by tag/handle/offset. 475 */ 476 477 478static void 479rmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, 480 bus_size_t offset, const u_int8_t * addr, size_t count) 481{ 482 TODO(); 483} 484 485static void 486rmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, 487 bus_size_t offset, const u_int16_t * addr, size_t count) 488{ 489 TODO(); 490} 491 492static void 493rmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, 494 bus_size_t offset, const u_int32_t * addr, size_t count) 495{ 496 TODO(); 497} 498 499/* 500 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 501 * by tag/handle starting at `offset'. 502 */ 503 504static void 505rmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh, 506 bus_size_t offset, u_int16_t value, size_t count) 507{ 508 bus_addr_t addr = bsh + offset; 509 510 for (; count != 0; count--, addr += 2) 511 (*(volatile u_int32_t *)(addr)) = value; 512} 513 514static void 515rmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh, 516 bus_size_t offset, u_int32_t value, size_t count) 517{ 518 bus_addr_t addr = bsh + offset; 519 520 for (; count != 0; count--, addr += 4) 521 (*(volatile u_int32_t *)(addr)) = value; 522} 523 524 525/* 526 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 527 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 528 */ 529static void 530rmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, 531 bus_size_t off1, bus_space_handle_t bsh2, 532 bus_size_t off2, size_t count) 533{ 534 printf("bus_space_copy_region_2 - unimplemented\n"); 535} 536 537/* 538 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 539 * described by tag/handle/offset and copy into buffer provided. 540 */ 541 542u_int8_t 543rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 544 bus_size_t offset) 545{ 546 547 return *((volatile u_int8_t *)(handle + offset)); 548} 549 550 551static u_int16_t 552rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 553 bus_size_t offset) 554{ 555 return *(volatile u_int16_t *)(handle + offset); 556} 557 558 559static u_int32_t 560rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 561 bus_size_t offset) 562{ 563 return (*(volatile u_int32_t *)(handle + offset)); 564} 565 566 567static void 568rmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, 569 bus_size_t offset, u_int8_t * addr, size_t count) 570{ 571 TODO(); 572} 573 574static void 575rmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, 576 bus_size_t offset, u_int16_t * addr, size_t count) 577{ 578 TODO(); 579} 580 581static void 582rmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, 583 bus_size_t offset, u_int32_t * addr, size_t count) 584{ 585 TODO(); 586} 587 588 589/* 590 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 591 * described by tag/handle and starting at `offset' and copy into 592 * buffer provided. 593 */ 594void 595rmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh, 596 bus_size_t offset, u_int8_t * addr, size_t count) 597{ 598 TODO(); 599} 600 601void 602rmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh, 603 bus_size_t offset, u_int16_t * addr, size_t count) 604{ 605 TODO(); 606} 607 608void 609rmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh, 610 bus_size_t offset, u_int32_t * addr, size_t count) 611{ 612 bus_addr_t baddr = bsh + offset; 613 614 while (count--) { 615 *addr++ = (*(volatile u_int32_t *)(baddr)); 616 baddr += 4; 617 } 618} 619 620void 621rmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle, 622 bus_size_t offset, u_int8_t value) 623{ 624 TODO(); 625} 626 627 628static void 629rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 630 bus_size_t offset, u_int16_t value) 631{ 632 TODO(); 633} 634 635 636static void 637rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 638 bus_size_t offset, u_int32_t value) 639{ 640 TODO(); 641} 642 643 644static void 645rmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, 646 bus_size_t offset, const u_int8_t * addr, size_t count) 647{ 648 TODO(); 649} 650 651static void 652rmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, 653 bus_size_t offset, const u_int16_t * addr, size_t count) 654{ 655 TODO(); 656} 657 658static void 659rmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, 660 bus_size_t offset, const u_int32_t * addr, size_t count) 661{ 662 TODO(); 663} 664 665void 666rmi_bus_space_write_region_2(void *t, 667 bus_space_handle_t bsh, 668 bus_size_t offset, 669 const u_int16_t * addr, 670 size_t count) 671{ 672 TODO(); 673} 674 675void 676rmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh, 677 bus_size_t offset, const u_int32_t * addr, size_t count) 678{ 679 TODO(); 680} 681 682static void 683rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 684 bus_size_t offset __unused, bus_size_t len __unused, int flags) 685{ 686} 687