bus.h revision 292308
1/*- 2 * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to The NetBSD Foundation 6 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 7 * NASA Ames Research Center. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * POSSIBILITY OF SUCH DAMAGE. 29 */ 30/* 31 * Copyright (c) 1997-1999 Eduardo E. Horvath. All rights reserved. 32 * Copyright (c) 1996 Charles M. Hannum. All rights reserved. 33 * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. 34 * 35 * Redistribution and use in source and binary forms, with or without 36 * modification, are permitted provided that the following conditions 37 * are met: 38 * 1. Redistributions of source code must retain the above copyright 39 * notice, this list of conditions and the following disclaimer. 40 * 2. Redistributions in binary form must reproduce the above copyright 41 * notice, this list of conditions and the following disclaimer in the 42 * documentation and/or other materials provided with the distribution. 43 * 3. All advertising materials mentioning features or use of this software 44 * must display the following acknowledgement: 45 * This product includes software developed by Christopher G. Demetriou 46 * for the NetBSD Project. 47 * 4. The name of the author may not be used to endorse or promote products 48 * derived from this software without specific prior written permission 49 * 50 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 51 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 52 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 53 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 54 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 55 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 56 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 57 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 58 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 59 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 60 * 61 * from: NetBSD: bus.h,v 1.58 2008/04/28 20:23:36 martin Exp 62 * and 63 * from: FreeBSD: src/sys/alpha/include/bus.h,v 1.9 2001/01/09 64 * 65 * $FreeBSD: stable/10/sys/sparc64/include/bus.h 292308 2015-12-16 00:56:38Z marius $ 66 */ 67 68#ifndef _MACHINE_BUS_H_ 69#define _MACHINE_BUS_H_ 70 71#ifdef BUS_SPACE_DEBUG 72#include <sys/ktr.h> 73#endif 74 75#include <machine/_bus.h> 76#include <machine/cpufunc.h> 77 78/* 79 * Nexus and SBus spaces are non-cached and big endian 80 * (except for RAM and PROM) 81 * 82 * PCI spaces are non-cached and little endian 83 */ 84#define NEXUS_BUS_SPACE 0 85#define SBUS_BUS_SPACE 1 86#define PCI_CONFIG_BUS_SPACE 2 87#define PCI_IO_BUS_SPACE 3 88#define PCI_MEMORY_BUS_SPACE 4 89#define LAST_BUS_SPACE 5 90 91extern const int bus_type_asi[]; 92extern const int bus_stream_asi[]; 93 94#define __BUS_SPACE_HAS_STREAM_METHODS 1 95 96#define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF 97#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF 98#define BUS_SPACE_MAXSIZE 0xFFFFFFFFFFFFFFFF 99#define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF 100#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF 101#define BUS_SPACE_MAXADDR 0xFFFFFFFF 102 103#define BUS_SPACE_UNRESTRICTED (~0) 104 105struct bus_space_tag { 106 void *bst_cookie; 107 bus_space_tag_t bst_parent; 108 int bst_type; 109 110 void (*bst_bus_barrier)(bus_space_tag_t, bus_space_handle_t, 111 bus_size_t, bus_size_t, int); 112}; 113 114/* 115 * Bus space function prototypes. 116 */ 117static void bus_space_barrier(bus_space_tag_t, bus_space_handle_t, bus_size_t, 118 bus_size_t, int); 119static int bus_space_subregion(bus_space_tag_t, bus_space_handle_t, 120 bus_size_t, bus_size_t, bus_space_handle_t *); 121 122/* 123 * Map a region of device bus space into CPU virtual address space. 124 */ 125int bus_space_map(bus_space_tag_t tag, bus_addr_t address, bus_size_t size, 126 int flags, bus_space_handle_t *handlep); 127 128/* 129 * Unmap a region of device bus space. 130 */ 131void bus_space_unmap(bus_space_tag_t tag, bus_space_handle_t handle, 132 bus_size_t size); 133 134/* This macro finds the first "upstream" implementation of method `f' */ 135#define _BS_CALL(t,f) \ 136 while (t->f == NULL) \ 137 t = t->bst_parent; \ 138 return (*(t)->f) 139 140static __inline void 141bus_space_barrier(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 142 bus_size_t s, int f) 143{ 144 145 _BS_CALL(t, bst_bus_barrier)(t, h, o, s, f); 146} 147 148static __inline int 149bus_space_subregion(bus_space_tag_t t __unused, bus_space_handle_t h, 150 bus_size_t o __unused, bus_size_t s __unused, bus_space_handle_t *hp) 151{ 152 153 *hp = h + o; 154 return (0); 155} 156 157/* flags for bus space map functions */ 158#define BUS_SPACE_MAP_CACHEABLE 0x0001 159#define BUS_SPACE_MAP_LINEAR 0x0002 160#define BUS_SPACE_MAP_READONLY 0x0004 161#define BUS_SPACE_MAP_PREFETCHABLE 0x0008 162/* placeholders for bus functions... */ 163#define BUS_SPACE_MAP_BUS1 0x0100 164#define BUS_SPACE_MAP_BUS2 0x0200 165#define BUS_SPACE_MAP_BUS3 0x0400 166#define BUS_SPACE_MAP_BUS4 0x0800 167 168/* flags for bus_space_barrier() */ 169#define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ 170#define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ 171 172#ifdef BUS_SPACE_DEBUG 173#define KTR_BUS KTR_SPARE2 174#define __BUS_DEBUG_ACCESS(h, o, desc, sz) do { \ 175 CTR4(KTR_BUS, "bus space: %s %d: handle %#lx, offset %#lx", \ 176 (desc), (sz), (h), (o)); \ 177} while (0) 178#else 179#define __BUS_DEBUG_ACCESS(h, o, desc, sz) 180#endif 181 182static __inline uint8_t 183bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 184{ 185 186 __BUS_DEBUG_ACCESS(h, o, "read", 1); 187 return (lduba_nc((caddr_t)(h + o), bus_type_asi[t->bst_type])); 188} 189 190static __inline uint16_t 191bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 192{ 193 194 __BUS_DEBUG_ACCESS(h, o, "read", 2); 195 return (lduha_nc((caddr_t)(h + o), bus_type_asi[t->bst_type])); 196} 197 198static __inline uint32_t 199bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 200{ 201 202 __BUS_DEBUG_ACCESS(h, o, "read", 4); 203 return (lduwa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type])); 204} 205 206static __inline uint64_t 207bus_space_read_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 208{ 209 210 __BUS_DEBUG_ACCESS(h, o, "read", 8); 211 return (ldxa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type])); 212} 213 214static __inline void 215bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 216 uint8_t *a, size_t c) 217{ 218 219 while (c-- > 0) 220 *a++ = bus_space_read_1(t, h, o); 221} 222 223static __inline void 224bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 225 uint16_t *a, size_t c) 226{ 227 228 while (c-- > 0) 229 *a++ = bus_space_read_2(t, h, o); 230} 231 232static __inline void 233bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 234 uint32_t *a, size_t c) 235{ 236 237 while (c-- > 0) 238 *a++ = bus_space_read_4(t, h, o); 239} 240 241static __inline void 242bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 243 uint64_t *a, size_t c) 244{ 245 246 while (c-- > 0) 247 *a++ = bus_space_read_8(t, h, o); 248} 249 250static __inline void 251bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 252 uint8_t v) 253{ 254 255 __BUS_DEBUG_ACCESS(h, o, "write", 1); 256 stba_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v); 257} 258 259static __inline void 260bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 261 uint16_t v) 262{ 263 264 __BUS_DEBUG_ACCESS(h, o, "write", 2); 265 stha_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v); 266} 267 268static __inline void 269bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 270 uint32_t v) 271{ 272 273 __BUS_DEBUG_ACCESS(h, o, "write", 4); 274 stwa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v); 275} 276 277static __inline void 278bus_space_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 279 uint64_t v) 280{ 281 282 __BUS_DEBUG_ACCESS(h, o, "write", 8); 283 stxa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v); 284} 285 286static __inline void 287bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 288 const uint8_t *a, size_t c) 289{ 290 291 while (c-- > 0) 292 bus_space_write_1(t, h, o, *a++); 293} 294 295static __inline void 296bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 297 const uint16_t *a, size_t c) 298{ 299 300 while (c-- > 0) 301 bus_space_write_2(t, h, o, *a++); 302} 303 304static __inline void 305bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 306 const uint32_t *a, size_t c) 307{ 308 309 while (c-- > 0) 310 bus_space_write_4(t, h, o, *a++); 311} 312 313static __inline void 314bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 315 const uint64_t *a, size_t c) 316{ 317 318 while (c-- > 0) 319 bus_space_write_8(t, h, o, *a++); 320} 321 322static __inline void 323bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 324 uint8_t v, size_t c) 325{ 326 327 while (c-- > 0) 328 bus_space_write_1(t, h, o, v); 329} 330 331static __inline void 332bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 333 uint16_t v, size_t c) 334{ 335 336 while (c-- > 0) 337 bus_space_write_2(t, h, o, v); 338} 339 340static __inline void 341bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 342 uint32_t v, size_t c) 343{ 344 345 while (c-- > 0) 346 bus_space_write_4(t, h, o, v); 347} 348 349static __inline void 350bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 351 uint64_t v, size_t c) 352{ 353 354 while (c-- > 0) 355 bus_space_write_8(t, h, o, v); 356} 357 358static __inline void 359bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 360 uint8_t *a, bus_size_t c) 361{ 362 363 for (; c; a++, c--, o++) 364 *a = bus_space_read_1(t, h, o); 365} 366 367static __inline void 368bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 369 uint16_t *a, bus_size_t c) 370{ 371 372 for (; c; a++, c--, o += 2) 373 *a = bus_space_read_2(t, h, o); 374} 375 376static __inline void 377bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 378 uint32_t *a, bus_size_t c) 379{ 380 381 for (; c; a++, c--, o += 4) 382 *a = bus_space_read_4(t, h, o); 383} 384 385static __inline void 386bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 387 uint64_t *a, bus_size_t c) 388{ 389 390 for (; c; a++, c--, o += 8) 391 *a = bus_space_read_8(t, h, o); 392} 393 394static __inline void 395bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 396 const uint8_t *a, bus_size_t c) 397{ 398 399 for (; c; a++, c--, o++) 400 bus_space_write_1(t, h, o, *a); 401} 402 403static __inline void 404bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 405 const uint16_t *a, bus_size_t c) 406{ 407 408 for (; c; a++, c--, o += 2) 409 bus_space_write_2(t, h, o, *a); 410} 411 412static __inline void 413bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 414 const uint32_t *a, bus_size_t c) 415{ 416 417 for (; c; a++, c--, o += 4) 418 bus_space_write_4(t, h, o, *a); 419} 420 421static __inline void 422bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 423 const uint64_t *a, bus_size_t c) 424{ 425 426 for (; c; a++, c--, o += 8) 427 bus_space_write_8(t, h, o, *a); 428} 429 430static __inline void 431bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 432 const uint8_t v, bus_size_t c) 433{ 434 435 for (; c; c--, o++) 436 bus_space_write_1(t, h, o, v); 437} 438 439static __inline void 440bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 441 const uint16_t v, bus_size_t c) 442{ 443 444 for (; c; c--, o += 2) 445 bus_space_write_2(t, h, o, v); 446} 447 448static __inline void 449bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 450 const uint32_t v, bus_size_t c) 451{ 452 453 for (; c; c--, o += 4) 454 bus_space_write_4(t, h, o, v); 455} 456 457static __inline void 458bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 459 const uint64_t v, bus_size_t c) 460{ 461 462 for (; c; c--, o += 8) 463 bus_space_write_8(t, h, o, v); 464} 465 466static __inline void 467bus_space_copy_region_1(bus_space_tag_t t, bus_space_handle_t h1, 468 bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 469{ 470 471 for (; c; c--, o1++, o2++) 472 bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2)); 473} 474 475static __inline void 476bus_space_copy_region_2(bus_space_tag_t t, bus_space_handle_t h1, 477 bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 478{ 479 480 for (; c; c--, o1 += 2, o2 += 2) 481 bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2)); 482} 483 484static __inline void 485bus_space_copy_region_4(bus_space_tag_t t, bus_space_handle_t h1, 486 bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 487{ 488 489 for (; c; c--, o1 += 4, o2 += 4) 490 bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2)); 491} 492 493static __inline void 494bus_space_copy_region_8(bus_space_tag_t t, bus_space_handle_t h1, 495 bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 496{ 497 498 for (; c; c--, o1 += 8, o2 += 8) 499 bus_space_write_8(t, h1, o1, bus_space_read_8(t, h2, o2)); 500} 501 502static __inline uint8_t 503bus_space_read_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 504{ 505 506 __BUS_DEBUG_ACCESS(h, o, "read stream", 1); 507 return (lduba_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type])); 508} 509 510static __inline uint16_t 511bus_space_read_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 512{ 513 514 __BUS_DEBUG_ACCESS(h, o, "read stream", 2); 515 return (lduha_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type])); 516} 517 518static __inline uint32_t 519bus_space_read_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 520{ 521 522 __BUS_DEBUG_ACCESS(h, o, "read stream", 4); 523 return (lduwa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type])); 524} 525 526static __inline uint64_t 527bus_space_read_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 528{ 529 530 __BUS_DEBUG_ACCESS(h, o, "read stream", 8); 531 return (ldxa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type])); 532} 533 534static __inline void 535bus_space_read_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, 536 bus_size_t o, uint8_t *a, size_t c) 537{ 538 539 while (c-- > 0) 540 *a++ = bus_space_read_stream_1(t, h, o); 541} 542 543static __inline void 544bus_space_read_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, 545 bus_size_t o, uint16_t *a, size_t c) 546{ 547 548 while (c-- > 0) 549 *a++ = bus_space_read_stream_2(t, h, o); 550} 551 552static __inline void 553bus_space_read_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, 554 bus_size_t o, uint32_t *a, size_t c) 555{ 556 557 while (c-- > 0) 558 *a++ = bus_space_read_stream_4(t, h, o); 559} 560 561static __inline void 562bus_space_read_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, 563 bus_size_t o, uint64_t *a, size_t c) 564{ 565 566 while (c-- > 0) 567 *a++ = bus_space_read_stream_8(t, h, o); 568} 569 570static __inline void 571bus_space_write_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 572 uint8_t v) 573{ 574 575 __BUS_DEBUG_ACCESS(h, o, "write stream", 1); 576 stba_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v); 577} 578 579static __inline void 580bus_space_write_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 581 uint16_t v) 582{ 583 584 __BUS_DEBUG_ACCESS(h, o, "write stream", 2); 585 stha_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v); 586} 587 588static __inline void 589bus_space_write_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 590 uint32_t v) 591{ 592 593 __BUS_DEBUG_ACCESS(h, o, "write stream", 4); 594 stwa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v); 595} 596 597static __inline void 598bus_space_write_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 599 uint64_t v) 600{ 601 602 __BUS_DEBUG_ACCESS(h, o, "write stream", 8); 603 stxa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v); 604} 605 606static __inline void 607bus_space_write_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, 608 bus_size_t o, const uint8_t *a, size_t c) 609{ 610 611 while (c-- > 0) 612 bus_space_write_stream_1(t, h, o, *a++); 613} 614 615static __inline void 616bus_space_write_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, 617 bus_size_t o, const uint16_t *a, size_t c) 618{ 619 620 while (c-- > 0) 621 bus_space_write_stream_2(t, h, o, *a++); 622} 623 624static __inline void 625bus_space_write_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, 626 bus_size_t o, const uint32_t *a, size_t c) 627{ 628 629 while (c-- > 0) 630 bus_space_write_stream_4(t, h, o, *a++); 631} 632 633static __inline void 634bus_space_write_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, 635 bus_size_t o, const uint64_t *a, size_t c) 636{ 637 638 while (c-- > 0) 639 bus_space_write_stream_8(t, h, o, *a++); 640} 641 642static __inline void 643bus_space_set_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, 644 bus_size_t o, uint8_t v, size_t c) 645{ 646 647 while (c-- > 0) 648 bus_space_write_stream_1(t, h, o, v); 649} 650 651static __inline void 652bus_space_set_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, 653 bus_size_t o, uint16_t v, size_t c) 654{ 655 656 while (c-- > 0) 657 bus_space_write_stream_2(t, h, o, v); 658} 659 660static __inline void 661bus_space_set_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, 662 bus_size_t o, uint32_t v, size_t c) 663{ 664 665 while (c-- > 0) 666 bus_space_write_stream_4(t, h, o, v); 667} 668 669static __inline void 670bus_space_set_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, 671 bus_size_t o, uint64_t v, size_t c) 672{ 673 674 while (c-- > 0) 675 bus_space_write_stream_8(t, h, o, v); 676} 677 678static __inline void 679bus_space_read_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, 680 bus_size_t o, uint8_t *a, bus_size_t c) 681{ 682 683 for (; c; a++, c--, o++) 684 *a = bus_space_read_stream_1(t, h, o); 685} 686 687static __inline void 688bus_space_read_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, 689 bus_size_t o, uint16_t *a, bus_size_t c) 690{ 691 692 for (; c; a++, c--, o += 2) 693 *a = bus_space_read_stream_2(t, h, o); 694} 695 696static __inline void 697bus_space_read_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, 698 bus_size_t o, uint32_t *a, bus_size_t c) 699{ 700 701 for (; c; a++, c--, o += 4) 702 *a = bus_space_read_stream_4(t, h, o); 703} 704 705static __inline void 706bus_space_read_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, 707 bus_size_t o, uint64_t *a, bus_size_t c) 708{ 709 710 for (; c; a++, c--, o += 8) 711 *a = bus_space_read_stream_8(t, h, o); 712} 713 714static __inline void 715bus_space_write_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, 716 bus_size_t o, const uint8_t *a, bus_size_t c) 717{ 718 719 for (; c; a++, c--, o++) 720 bus_space_write_stream_1(t, h, o, *a); 721} 722 723static __inline void 724bus_space_write_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, 725 bus_size_t o, const uint16_t *a, bus_size_t c) 726{ 727 728 for (; c; a++, c--, o += 2) 729 bus_space_write_stream_2(t, h, o, *a); 730} 731 732static __inline void 733bus_space_write_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, 734 bus_size_t o, const uint32_t *a, bus_size_t c) 735{ 736 737 for (; c; a++, c--, o += 4) 738 bus_space_write_stream_4(t, h, o, *a); 739} 740 741static __inline void 742bus_space_write_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, 743 bus_size_t o, const uint64_t *a, bus_size_t c) 744{ 745 746 for (; c; a++, c--, o += 8) 747 bus_space_write_stream_8(t, h, o, *a); 748} 749 750static __inline void 751bus_space_set_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, 752 bus_size_t o, const uint8_t v, bus_size_t c) 753{ 754 755 for (; c; c--, o++) 756 bus_space_write_stream_1(t, h, o, v); 757} 758 759static __inline void 760bus_space_set_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, 761 bus_size_t o, const uint16_t v, bus_size_t c) 762{ 763 764 for (; c; c--, o += 2) 765 bus_space_write_stream_2(t, h, o, v); 766} 767 768static __inline void 769bus_space_set_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, 770 bus_size_t o, const uint32_t v, bus_size_t c) 771{ 772 773 for (; c; c--, o += 4) 774 bus_space_write_stream_4(t, h, o, v); 775} 776 777static __inline void 778bus_space_set_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, 779 bus_size_t o, const uint64_t v, bus_size_t c) 780{ 781 782 for (; c; c--, o += 8) 783 bus_space_write_stream_8(t, h, o, v); 784} 785 786static __inline void 787bus_space_copy_region_stream_1(bus_space_tag_t t, bus_space_handle_t h1, 788 bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 789{ 790 791 for (; c; c--, o1++, o2++) 792 bus_space_write_stream_1(t, h1, o1, bus_space_read_stream_1(t, h2, 793 o2)); 794} 795 796static __inline void 797bus_space_copy_region_stream_2(bus_space_tag_t t, bus_space_handle_t h1, 798 bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 799{ 800 801 for (; c; c--, o1 += 2, o2 += 2) 802 bus_space_write_stream_2(t, h1, o1, bus_space_read_stream_2(t, h2, 803 o2)); 804} 805 806static __inline void 807bus_space_copy_region_stream_4(bus_space_tag_t t, bus_space_handle_t h1, 808 bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 809{ 810 811 for (; c; c--, o1 += 4, o2 += 4) 812 bus_space_write_stream_4(t, h1, o1, bus_space_read_stream_4(t, h2, 813 o2)); 814} 815 816static __inline void 817bus_space_copy_region_stream_8(bus_space_tag_t t, bus_space_handle_t h1, 818 bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 819{ 820 821 for (; c; c--, o1 += 8, o2 += 8) 822 bus_space_write_stream_8(t, h1, o1, bus_space_read_8(t, h2, o2)); 823} 824 825static __inline int 826bus_space_peek_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 827 uint8_t *a) 828{ 829 830 __BUS_DEBUG_ACCESS(h, o, "peek", 1); 831 return (fasword8(bus_type_asi[t->bst_type], (caddr_t)(h + o), a)); 832} 833 834static __inline int 835bus_space_peek_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 836 uint16_t *a) 837{ 838 839 __BUS_DEBUG_ACCESS(h, o, "peek", 2); 840 return (fasword16(bus_type_asi[t->bst_type], (caddr_t)(h + o), a)); 841} 842 843static __inline int 844bus_space_peek_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 845 uint32_t *a) 846{ 847 848 __BUS_DEBUG_ACCESS(h, o, "peek", 4); 849 return (fasword32(bus_type_asi[t->bst_type], (caddr_t)(h + o), a)); 850} 851 852#include <machine/bus_dma.h> 853 854#endif /* !_MACHINE_BUS_H_ */ 855