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