bus_machdep.c revision 257178
1/*- 2 * Copyright (c) 2006 Semihalf, Rafal Jaworowski <raj@semihalf.com> 3 * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to The NetBSD Foundation 7 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 8 * NASA Ames Research Center. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the NetBSD 21 * Foundation, Inc. and its contributors. 22 * 4. Neither the name of The NetBSD Foundation nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 * POSSIBILITY OF SUCH DAMAGE. 37 */ 38 39#include <sys/cdefs.h> 40__FBSDID("$FreeBSD: head/sys/powerpc/powerpc/bus_machdep.c 257178 2013-10-26 18:18:14Z nwhitehorn $"); 41 42#define KTR_BE_IO 0 43#define KTR_LE_IO 0 44 45#include <sys/param.h> 46#include <sys/systm.h> 47#include <sys/bus.h> 48#include <sys/ktr.h> 49#include <vm/vm.h> 50#include <vm/pmap.h> 51 52#include <machine/bus.h> 53#include <machine/pio.h> 54#include <machine/md_var.h> 55 56#define TODO panic("%s: not implemented", __func__) 57 58#define MAX_EARLYBOOT_MAPPINGS 6 59 60static struct { 61 vm_offset_t virt; 62 bus_addr_t addr; 63 bus_size_t size; 64 int flags; 65} earlyboot_mappings[MAX_EARLYBOOT_MAPPINGS]; 66static int earlyboot_map_idx = 0; 67 68void bs_remap_earlyboot(void); 69 70static __inline void * 71__ppc_ba(bus_space_handle_t bsh, bus_size_t ofs) 72{ 73 return ((void *)(bsh + ofs)); 74} 75 76static int 77bs_gen_map(bus_addr_t addr, bus_size_t size, int flags, 78 bus_space_handle_t *bshp) 79{ 80 vm_memattr_t ma; 81 82 /* 83 * Record what we did if we haven't enabled the MMU yet. We 84 * will need to remap it as soon as the MMU comes up. 85 */ 86 if (!pmap_bootstrapped) { 87 KASSERT(earlyboot_map_idx < MAX_EARLYBOOT_MAPPINGS, 88 ("%s: too many early boot mapping requests", __func__)); 89 earlyboot_mappings[earlyboot_map_idx].addr = addr; 90 earlyboot_mappings[earlyboot_map_idx].virt = 91 pmap_early_io_map(addr, size); 92 earlyboot_mappings[earlyboot_map_idx].size = size; 93 earlyboot_mappings[earlyboot_map_idx].flags = flags; 94 *bshp = earlyboot_mappings[earlyboot_map_idx].virt; 95 earlyboot_map_idx++; 96 } else { 97 ma = VM_MEMATTR_DEFAULT; 98 switch (flags) { 99 case BUS_SPACE_MAP_CACHEABLE: 100 ma = VM_MEMATTR_CACHEABLE; 101 break; 102 case BUS_SPACE_MAP_PREFETCHABLE: 103 ma = VM_MEMATTR_PREFETCHABLE; 104 break; 105 } 106 *bshp = (bus_space_handle_t)pmap_mapdev_attr(addr, size, ma); 107 } 108 109 return (0); 110} 111 112void 113bs_remap_earlyboot(void) 114{ 115 int i; 116 vm_offset_t pa, spa, va; 117 vm_memattr_t ma; 118 119 for (i = 0; i < earlyboot_map_idx; i++) { 120 spa = earlyboot_mappings[i].addr; 121 if (spa == earlyboot_mappings[i].virt && 122 pmap_dev_direct_mapped(spa, earlyboot_mappings[i].size) == 0) 123 continue; 124 125 ma = VM_MEMATTR_DEFAULT; 126 switch (earlyboot_mappings[i].flags) { 127 case BUS_SPACE_MAP_CACHEABLE: 128 ma = VM_MEMATTR_CACHEABLE; 129 break; 130 case BUS_SPACE_MAP_PREFETCHABLE: 131 ma = VM_MEMATTR_PREFETCHABLE; 132 break; 133 } 134 135 pa = trunc_page(spa); 136 va = trunc_page(earlyboot_mappings[i].virt); 137 while (pa < spa + earlyboot_mappings[i].size) { 138 pmap_kenter_attr(va, pa, ma); 139 va += PAGE_SIZE; 140 pa += PAGE_SIZE; 141 } 142 } 143} 144 145static void 146bs_gen_unmap(bus_size_t size __unused) 147{ 148} 149 150static int 151bs_gen_subregion(bus_space_handle_t bsh, bus_size_t ofs, 152 bus_size_t size __unused, bus_space_handle_t *nbshp) 153{ 154 *nbshp = bsh + ofs; 155 return (0); 156} 157 158static int 159bs_gen_alloc(bus_addr_t rstart __unused, bus_addr_t rend __unused, 160 bus_size_t size __unused, bus_size_t alignment __unused, 161 bus_size_t boundary __unused, int flags __unused, 162 bus_addr_t *bpap __unused, bus_space_handle_t *bshp __unused) 163{ 164 TODO; 165} 166 167static void 168bs_gen_free(bus_space_handle_t bsh __unused, bus_size_t size __unused) 169{ 170 TODO; 171} 172 173static void 174bs_gen_barrier(bus_space_handle_t bsh __unused, bus_size_t ofs __unused, 175 bus_size_t size __unused, int flags __unused) 176{ 177 178 powerpc_iomb(); 179} 180 181/* 182 * Big-endian access functions 183 */ 184static uint8_t 185bs_be_rs_1(bus_space_handle_t bsh, bus_size_t ofs) 186{ 187 volatile uint8_t *addr; 188 uint8_t res; 189 190 addr = __ppc_ba(bsh, ofs); 191 res = *addr; 192 powerpc_iomb(); 193 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res); 194 return (res); 195} 196 197static uint16_t 198bs_be_rs_2(bus_space_handle_t bsh, bus_size_t ofs) 199{ 200 volatile uint16_t *addr; 201 uint16_t res; 202 203 addr = __ppc_ba(bsh, ofs); 204 res = *addr; 205 powerpc_iomb(); 206 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res); 207 return (res); 208} 209 210static uint32_t 211bs_be_rs_4(bus_space_handle_t bsh, bus_size_t ofs) 212{ 213 volatile uint32_t *addr; 214 uint32_t res; 215 216 addr = __ppc_ba(bsh, ofs); 217 res = *addr; 218 powerpc_iomb(); 219 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res); 220 return (res); 221} 222 223static uint64_t 224bs_be_rs_8(bus_space_handle_t bsh, bus_size_t ofs) 225{ 226 volatile uint64_t *addr; 227 uint64_t res; 228 229 addr = __ppc_ba(bsh, ofs); 230 res = *addr; 231 powerpc_iomb(); 232 return (res); 233} 234 235static void 236bs_be_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt) 237{ 238 ins8(__ppc_ba(bsh, ofs), addr, cnt); 239} 240 241static void 242bs_be_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt) 243{ 244 ins16(__ppc_ba(bsh, ofs), addr, cnt); 245} 246 247static void 248bs_be_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt) 249{ 250 ins32(__ppc_ba(bsh, ofs), addr, cnt); 251} 252 253static void 254bs_be_rm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt) 255{ 256 ins64(__ppc_ba(bsh, ofs), addr, cnt); 257} 258 259static void 260bs_be_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt) 261{ 262 volatile uint8_t *s = __ppc_ba(bsh, ofs); 263 264 while (cnt--) 265 *addr++ = *s++; 266 powerpc_iomb(); 267} 268 269static void 270bs_be_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt) 271{ 272 volatile uint16_t *s = __ppc_ba(bsh, ofs); 273 274 while (cnt--) 275 *addr++ = *s++; 276 powerpc_iomb(); 277} 278 279static void 280bs_be_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt) 281{ 282 volatile uint32_t *s = __ppc_ba(bsh, ofs); 283 284 while (cnt--) 285 *addr++ = *s++; 286 powerpc_iomb(); 287} 288 289static void 290bs_be_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt) 291{ 292 volatile uint64_t *s = __ppc_ba(bsh, ofs); 293 294 while (cnt--) 295 *addr++ = *s++; 296 powerpc_iomb(); 297} 298 299static void 300bs_be_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val) 301{ 302 volatile uint8_t *addr; 303 304 addr = __ppc_ba(bsh, ofs); 305 *addr = val; 306 powerpc_iomb(); 307 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val); 308} 309 310static void 311bs_be_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val) 312{ 313 volatile uint16_t *addr; 314 315 addr = __ppc_ba(bsh, ofs); 316 *addr = val; 317 powerpc_iomb(); 318 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val); 319} 320 321static void 322bs_be_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val) 323{ 324 volatile uint32_t *addr; 325 326 addr = __ppc_ba(bsh, ofs); 327 *addr = val; 328 powerpc_iomb(); 329 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val); 330} 331 332static void 333bs_be_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val) 334{ 335 volatile uint64_t *addr; 336 337 addr = __ppc_ba(bsh, ofs); 338 *addr = val; 339 powerpc_iomb(); 340} 341 342static void 343bs_be_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr, 344 bus_size_t cnt) 345{ 346 outsb(__ppc_ba(bsh, ofs), addr, cnt); 347} 348 349static void 350bs_be_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr, 351 bus_size_t cnt) 352{ 353 outsw(__ppc_ba(bsh, ofs), addr, cnt); 354} 355 356static void 357bs_be_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr, 358 bus_size_t cnt) 359{ 360 outsl(__ppc_ba(bsh, ofs), addr, cnt); 361} 362 363static void 364bs_be_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr, 365 bus_size_t cnt) 366{ 367 outsll(__ppc_ba(bsh, ofs), addr, cnt); 368} 369 370static void 371bs_be_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr, 372 size_t cnt) 373{ 374 volatile uint8_t *d = __ppc_ba(bsh, ofs); 375 376 while (cnt--) 377 *d++ = *addr++; 378 powerpc_iomb(); 379} 380 381static void 382bs_be_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr, 383 size_t cnt) 384{ 385 volatile uint16_t *d = __ppc_ba(bsh, ofs); 386 387 while (cnt--) 388 *d++ = *addr++; 389 powerpc_iomb(); 390} 391 392static void 393bs_be_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr, 394 size_t cnt) 395{ 396 volatile uint32_t *d = __ppc_ba(bsh, ofs); 397 398 while (cnt--) 399 *d++ = *addr++; 400 powerpc_iomb(); 401} 402 403static void 404bs_be_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr, 405 size_t cnt) 406{ 407 volatile uint64_t *d = __ppc_ba(bsh, ofs); 408 409 while (cnt--) 410 *d++ = *addr++; 411 powerpc_iomb(); 412} 413 414static void 415bs_be_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt) 416{ 417 volatile uint8_t *d = __ppc_ba(bsh, ofs); 418 419 while (cnt--) 420 *d = val; 421 powerpc_iomb(); 422} 423 424static void 425bs_be_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt) 426{ 427 volatile uint16_t *d = __ppc_ba(bsh, ofs); 428 429 while (cnt--) 430 *d = val; 431 powerpc_iomb(); 432} 433 434static void 435bs_be_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt) 436{ 437 volatile uint32_t *d = __ppc_ba(bsh, ofs); 438 439 while (cnt--) 440 *d = val; 441 powerpc_iomb(); 442} 443 444static void 445bs_be_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt) 446{ 447 volatile uint64_t *d = __ppc_ba(bsh, ofs); 448 449 while (cnt--) 450 *d = val; 451 powerpc_iomb(); 452} 453 454static void 455bs_be_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt) 456{ 457 volatile uint8_t *d = __ppc_ba(bsh, ofs); 458 459 while (cnt--) 460 *d++ = val; 461 powerpc_iomb(); 462} 463 464static void 465bs_be_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt) 466{ 467 volatile uint16_t *d = __ppc_ba(bsh, ofs); 468 469 while (cnt--) 470 *d++ = val; 471 powerpc_iomb(); 472} 473 474static void 475bs_be_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt) 476{ 477 volatile uint32_t *d = __ppc_ba(bsh, ofs); 478 479 while (cnt--) 480 *d++ = val; 481 powerpc_iomb(); 482} 483 484static void 485bs_be_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt) 486{ 487 volatile uint64_t *d = __ppc_ba(bsh, ofs); 488 489 while (cnt--) 490 *d++ = val; 491 powerpc_iomb(); 492} 493 494/* 495 * Little-endian access functions 496 */ 497static uint8_t 498bs_le_rs_1(bus_space_handle_t bsh, bus_size_t ofs) 499{ 500 volatile uint8_t *addr; 501 uint8_t res; 502 503 addr = __ppc_ba(bsh, ofs); 504 res = *addr; 505 powerpc_iomb(); 506 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res); 507 return (res); 508} 509 510static uint16_t 511bs_le_rs_2(bus_space_handle_t bsh, bus_size_t ofs) 512{ 513 volatile uint16_t *addr; 514 uint16_t res; 515 516 addr = __ppc_ba(bsh, ofs); 517 __asm __volatile("lhbrx %0, 0, %1" : "=r"(res) : "r"(addr)); 518 powerpc_iomb(); 519 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res); 520 return (res); 521} 522 523static uint32_t 524bs_le_rs_4(bus_space_handle_t bsh, bus_size_t ofs) 525{ 526 volatile uint32_t *addr; 527 uint32_t res; 528 529 addr = __ppc_ba(bsh, ofs); 530 __asm __volatile("lwbrx %0, 0, %1" : "=r"(res) : "r"(addr)); 531 powerpc_iomb(); 532 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res); 533 return (res); 534} 535 536static uint64_t 537bs_le_rs_8(bus_space_handle_t bsh, bus_size_t ofs) 538{ 539 TODO; 540} 541 542static void 543bs_le_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt) 544{ 545 ins8(__ppc_ba(bsh, ofs), addr, cnt); 546} 547 548static void 549bs_le_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt) 550{ 551 ins16rb(__ppc_ba(bsh, ofs), addr, cnt); 552} 553 554static void 555bs_le_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt) 556{ 557 ins32rb(__ppc_ba(bsh, ofs), addr, cnt); 558} 559 560static void 561bs_le_rm_8(bus_space_handle_t bshh, bus_size_t ofs, uint64_t *addr, size_t cnt) 562{ 563 TODO; 564} 565 566static void 567bs_le_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt) 568{ 569 volatile uint8_t *s = __ppc_ba(bsh, ofs); 570 571 while (cnt--) 572 *addr++ = *s++; 573 powerpc_iomb(); 574} 575 576static void 577bs_le_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt) 578{ 579 volatile uint16_t *s = __ppc_ba(bsh, ofs); 580 581 while (cnt--) 582 *addr++ = in16rb(s++); 583 powerpc_iomb(); 584} 585 586static void 587bs_le_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt) 588{ 589 volatile uint32_t *s = __ppc_ba(bsh, ofs); 590 591 while (cnt--) 592 *addr++ = in32rb(s++); 593 powerpc_iomb(); 594} 595 596static void 597bs_le_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt) 598{ 599 TODO; 600} 601 602static void 603bs_le_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val) 604{ 605 volatile uint8_t *addr; 606 607 addr = __ppc_ba(bsh, ofs); 608 *addr = val; 609 powerpc_iomb(); 610 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val); 611} 612 613static void 614bs_le_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val) 615{ 616 volatile uint16_t *addr; 617 618 addr = __ppc_ba(bsh, ofs); 619 __asm __volatile("sthbrx %0, 0, %1" :: "r"(val), "r"(addr)); 620 powerpc_iomb(); 621 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val); 622} 623 624static void 625bs_le_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val) 626{ 627 volatile uint32_t *addr; 628 629 addr = __ppc_ba(bsh, ofs); 630 __asm __volatile("stwbrx %0, 0, %1" :: "r"(val), "r"(addr)); 631 powerpc_iomb(); 632 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val); 633} 634 635static void 636bs_le_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val) 637{ 638 TODO; 639} 640 641static void 642bs_le_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr, 643 bus_size_t cnt) 644{ 645 outs8(__ppc_ba(bsh, ofs), addr, cnt); 646} 647 648static void 649bs_le_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr, 650 bus_size_t cnt) 651{ 652 outs16rb(__ppc_ba(bsh, ofs), addr, cnt); 653} 654 655static void 656bs_le_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr, 657 bus_size_t cnt) 658{ 659 outs32rb(__ppc_ba(bsh, ofs), addr, cnt); 660} 661 662static void 663bs_le_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr, 664 bus_size_t cnt) 665{ 666 TODO; 667} 668 669static void 670bs_le_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr, 671 size_t cnt) 672{ 673 volatile uint8_t *d = __ppc_ba(bsh, ofs); 674 675 while (cnt--) 676 *d++ = *addr++; 677 powerpc_iomb(); 678} 679 680static void 681bs_le_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr, 682 size_t cnt) 683{ 684 volatile uint16_t *d = __ppc_ba(bsh, ofs); 685 686 while (cnt--) 687 out16rb(d++, *addr++); 688 powerpc_iomb(); 689} 690 691static void 692bs_le_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr, 693 size_t cnt) 694{ 695 volatile uint32_t *d = __ppc_ba(bsh, ofs); 696 697 while (cnt--) 698 out32rb(d++, *addr++); 699 powerpc_iomb(); 700} 701 702static void 703bs_le_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr, 704 size_t cnt) 705{ 706 TODO; 707} 708 709static void 710bs_le_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt) 711{ 712 volatile uint8_t *d = __ppc_ba(bsh, ofs); 713 714 while (cnt--) 715 *d = val; 716 powerpc_iomb(); 717} 718 719static void 720bs_le_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt) 721{ 722 volatile uint16_t *d = __ppc_ba(bsh, ofs); 723 724 while (cnt--) 725 out16rb(d, val); 726 powerpc_iomb(); 727} 728 729static void 730bs_le_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt) 731{ 732 volatile uint32_t *d = __ppc_ba(bsh, ofs); 733 734 while (cnt--) 735 out32rb(d, val); 736 powerpc_iomb(); 737} 738 739static void 740bs_le_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt) 741{ 742 TODO; 743} 744 745static void 746bs_le_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt) 747{ 748 volatile uint8_t *d = __ppc_ba(bsh, ofs); 749 750 while (cnt--) 751 *d++ = val; 752 powerpc_iomb(); 753} 754 755static void 756bs_le_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt) 757{ 758 volatile uint16_t *d = __ppc_ba(bsh, ofs); 759 760 while (cnt--) 761 out16rb(d++, val); 762 powerpc_iomb(); 763} 764 765static void 766bs_le_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt) 767{ 768 volatile uint32_t *d = __ppc_ba(bsh, ofs); 769 770 while (cnt--) 771 out32rb(d++, val); 772 powerpc_iomb(); 773} 774 775static void 776bs_le_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt) 777{ 778 TODO; 779} 780 781struct bus_space bs_be_tag = { 782 /* mapping/unmapping */ 783 bs_gen_map, 784 bs_gen_unmap, 785 bs_gen_subregion, 786 787 /* allocation/deallocation */ 788 bs_gen_alloc, 789 bs_gen_free, 790 791 /* barrier */ 792 bs_gen_barrier, 793 794 /* read (single) */ 795 bs_be_rs_1, 796 bs_be_rs_2, 797 bs_be_rs_4, 798 bs_be_rs_8, 799 800 bs_be_rs_2, 801 bs_be_rs_4, 802 bs_be_rs_8, 803 804 /* read multiple */ 805 bs_be_rm_1, 806 bs_be_rm_2, 807 bs_be_rm_4, 808 bs_be_rm_8, 809 810 bs_be_rm_2, 811 bs_be_rm_4, 812 bs_be_rm_8, 813 814 /* read region */ 815 bs_be_rr_1, 816 bs_be_rr_2, 817 bs_be_rr_4, 818 bs_be_rr_8, 819 820 bs_be_rr_2, 821 bs_be_rr_4, 822 bs_be_rr_8, 823 824 /* write (single) */ 825 bs_be_ws_1, 826 bs_be_ws_2, 827 bs_be_ws_4, 828 bs_be_ws_8, 829 830 bs_be_ws_2, 831 bs_be_ws_4, 832 bs_be_ws_8, 833 834 /* write multiple */ 835 bs_be_wm_1, 836 bs_be_wm_2, 837 bs_be_wm_4, 838 bs_be_wm_8, 839 840 bs_be_wm_2, 841 bs_be_wm_4, 842 bs_be_wm_8, 843 844 /* write region */ 845 bs_be_wr_1, 846 bs_be_wr_2, 847 bs_be_wr_4, 848 bs_be_wr_8, 849 850 bs_be_wr_2, 851 bs_be_wr_4, 852 bs_be_wr_8, 853 854 /* set multiple */ 855 bs_be_sm_1, 856 bs_be_sm_2, 857 bs_be_sm_4, 858 bs_be_sm_8, 859 860 bs_be_sm_2, 861 bs_be_sm_4, 862 bs_be_sm_8, 863 864 /* set region */ 865 bs_be_sr_1, 866 bs_be_sr_2, 867 bs_be_sr_4, 868 bs_be_sr_8, 869 870 bs_be_sr_2, 871 bs_be_sr_4, 872 bs_be_sr_8, 873}; 874 875struct bus_space bs_le_tag = { 876 /* mapping/unmapping */ 877 bs_gen_map, 878 bs_gen_unmap, 879 bs_gen_subregion, 880 881 /* allocation/deallocation */ 882 bs_gen_alloc, 883 bs_gen_free, 884 885 /* barrier */ 886 bs_gen_barrier, 887 888 /* read (single) */ 889 bs_le_rs_1, 890 bs_le_rs_2, 891 bs_le_rs_4, 892 bs_le_rs_8, 893 894 bs_be_rs_2, 895 bs_be_rs_4, 896 bs_be_rs_8, 897 898 /* read multiple */ 899 bs_le_rm_1, 900 bs_le_rm_2, 901 bs_le_rm_4, 902 bs_le_rm_8, 903 904 bs_be_rm_2, 905 bs_be_rm_4, 906 bs_be_rm_8, 907 908 /* read region */ 909 bs_le_rr_1, 910 bs_le_rr_2, 911 bs_le_rr_4, 912 bs_le_rr_8, 913 914 bs_be_rr_2, 915 bs_be_rr_4, 916 bs_be_rr_8, 917 918 /* write (single) */ 919 bs_le_ws_1, 920 bs_le_ws_2, 921 bs_le_ws_4, 922 bs_le_ws_8, 923 924 bs_be_ws_2, 925 bs_be_ws_4, 926 bs_be_ws_8, 927 928 /* write multiple */ 929 bs_le_wm_1, 930 bs_le_wm_2, 931 bs_le_wm_4, 932 bs_le_wm_8, 933 934 bs_be_wm_2, 935 bs_be_wm_4, 936 bs_be_wm_8, 937 938 /* write region */ 939 bs_le_wr_1, 940 bs_le_wr_2, 941 bs_le_wr_4, 942 bs_le_wr_8, 943 944 bs_be_wr_2, 945 bs_be_wr_4, 946 bs_be_wr_8, 947 948 /* set multiple */ 949 bs_le_sm_1, 950 bs_le_sm_2, 951 bs_le_sm_4, 952 bs_le_sm_8, 953 954 bs_be_sm_2, 955 bs_be_sm_4, 956 bs_be_sm_8, 957 958 /* set region */ 959 bs_le_sr_1, 960 bs_le_sr_2, 961 bs_le_sr_4, 962 bs_le_sr_8, 963 964 bs_be_sr_2, 965 bs_be_sr_4, 966 bs_be_sr_8, 967}; 968