1 /* $NetBSD: bus_funcs.h,v 1.1 2011/07/01 17:10:01 dyoung Exp $ */ 2 3 /*- 4 * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 9 * NASA Ames Research Center. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /* 34 * Copyright (c) 1996 Charles M. Hannum. All rights reserved. 35 * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. 36 * 37 * Redistribution and use in source and binary forms, with or without 38 * modification, are permitted provided that the following conditions 39 * are met: 40 * 1. Redistributions of source code must retain the above copyright 41 * notice, this list of conditions and the following disclaimer. 42 * 2. Redistributions in binary form must reproduce the above copyright 43 * notice, this list of conditions and the following disclaimer in the 44 * documentation and/or other materials provided with the distribution. 45 * 3. All advertising materials mentioning features or use of this software 46 * must display the following acknowledgement: 47 * This product includes software developed by Christopher G. Demetriou 48 * for the NetBSD Project. 49 * 4. The name of the author may not be used to endorse or promote products 50 * derived from this software without specific prior written permission 51 * 52 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 53 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 54 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 55 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 56 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 57 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 58 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 59 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 60 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 61 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 62 */ 63 64 #ifndef _SH3_BUS_FUNCS_H_ 65 #define _SH3_BUS_FUNCS_H_ 66 67 int bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t size, 68 int, bus_space_handle_t *); 69 70 #ifdef SH4_PCMCIA 71 int shpcmcia_memio_map(bus_space_tag_t, bus_addr_t, bus_size_t size, 72 int, bus_space_handle_t *); 73 74 int shpcmcia_mem_add_mapping(bus_addr_t, bus_size_t, int, 75 bus_space_handle_t *); 76 void shpcmcia_memio_unmap(bus_space_tag_t, bus_space_handle_t, 77 bus_size_t); 78 void shpcmcia_memio_free(bus_space_tag_t, bus_space_handle_t, 79 bus_size_t); 80 int shpcmcia_memio_subregion(bus_space_tag_t, bus_space_handle_t, 81 bus_size_t, bus_size_t, bus_space_handle_t *); 82 #endif 83 84 /* 85 * u_intN_t bus_space_read_N(bus_space_tag_t tag, 86 * bus_space_handle_t bsh, bus_size_t offset); 87 * 88 * Read a 1, 2, 4, or 8 byte quantity from bus space 89 * described by tag/handle/offset. 90 */ 91 static __inline uint8_t bus_space_read_1 92 (bus_space_tag_t, bus_space_handle_t, bus_size_t); 93 static __inline uint16_t bus_space_read_2 94 (bus_space_tag_t, bus_space_handle_t, bus_size_t); 95 static __inline uint32_t bus_space_read_4 96 (bus_space_tag_t, bus_space_handle_t, bus_size_t); 97 98 uint8_t 99 bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t bsh, 100 bus_size_t offset) 101 { 102 103 return *(volatile uint8_t *)(bsh + offset); 104 } 105 106 uint16_t 107 bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t bsh, 108 bus_size_t offset) 109 { 110 111 return bswap16(*(volatile uint16_t *)(bsh + offset)); 112 } 113 114 uint32_t 115 bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t bsh, 116 bus_size_t offset) 117 { 118 119 return bswap32(*(volatile uint32_t *)(bsh + offset)); 120 } 121 122 static __inline uint16_t bus_space_read_stream_2 123 (bus_space_tag_t, bus_space_handle_t, bus_size_t); 124 125 static __inline uint32_t bus_space_read_stream_4 126 (bus_space_tag_t, bus_space_handle_t, bus_size_t); 127 128 uint16_t 129 bus_space_read_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh, 130 bus_size_t offset) 131 { 132 133 return *(volatile uint16_t *)(bsh + offset); 134 } 135 136 uint32_t 137 bus_space_read_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh, 138 bus_size_t offset) 139 { 140 141 return *(volatile uint32_t *)(bsh + offset); 142 } 143 144 /* 145 * void bus_space_read_multi_N(bus_space_tag_t tag, 146 * bus_space_handle_t bsh, bus_size_t offset, 147 * u_intN_t *addr, size_t count); 148 * 149 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 150 * described by tag/handle/offset and copy into buffer provided. 151 */ 152 static __inline void bus_space_read_multi_1(bus_space_tag_t, 153 bus_space_handle_t, bus_size_t, uint8_t *, bus_size_t); 154 static __inline void bus_space_read_multi_2(bus_space_tag_t, 155 bus_space_handle_t, bus_size_t, uint16_t *, bus_size_t); 156 static __inline void bus_space_read_multi_4(bus_space_tag_t, 157 bus_space_handle_t, bus_size_t, uint32_t *, bus_size_t); 158 159 void 160 bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, 161 bus_size_t offset, uint8_t *addr, bus_size_t count) 162 { 163 164 while (count--) 165 *addr++ = bus_space_read_1(tag, bsh, offset); 166 } 167 168 void 169 bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, 170 bus_size_t offset, uint16_t *addr, bus_size_t count) 171 { 172 173 while (count--) 174 *addr++ = bus_space_read_2(tag, bsh, offset); 175 } 176 177 void 178 bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, 179 bus_size_t offset, uint32_t *addr, bus_size_t count) 180 { 181 182 while (count--) 183 *addr++ = bus_space_read_4(tag, bsh, offset); 184 } 185 186 static __inline void bus_space_read_multi_stream_2(bus_space_tag_t, 187 bus_space_handle_t, bus_size_t, uint16_t *, bus_size_t); 188 static __inline void bus_space_read_multi_stream_4(bus_space_tag_t, 189 bus_space_handle_t, bus_size_t, uint32_t *, bus_size_t); 190 191 void 192 bus_space_read_multi_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh, 193 bus_size_t offset, uint16_t *addr, bus_size_t count) 194 { 195 196 while (count--) 197 *addr++ = *(volatile uint16_t *)(bsh + offset); 198 } 199 200 void 201 bus_space_read_multi_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh, 202 bus_size_t offset, uint32_t *addr, bus_size_t count) 203 { 204 205 while (count--) 206 *addr++ = *(volatile uint32_t *)(bsh + offset); 207 } 208 209 /* 210 * int bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart, 211 * bus_addr_t rend, bus_size_t size, bus_size_t align, 212 * bus_size_t boundary, int flags, bus_addr_t *addrp, 213 * bus_space_handle_t *bshp); 214 * 215 * Allocate a region of bus space. 216 */ 217 int sh_memio_alloc(bus_space_tag_t, bus_addr_t, bus_addr_t, bus_size_t, 218 bus_size_t, bus_size_t, int, bus_addr_t *, bus_space_handle_t *); 219 220 #define bus_space_alloc(t, rs, re, s, a, b, f, ap, hp) \ 221 sh_memio_alloc((t), (rs), (re), (s), (a), (b), (f), (ap), (hp)) 222 223 /* 224 * int bus_space_free(bus_space_tag_t t, 225 * bus_space_handle_t bsh, bus_size_t size); 226 * 227 * Free a region of bus space. 228 */ 229 void sh_memio_free(bus_space_tag_t, bus_space_handle_t, bus_size_t); 230 231 #define bus_space_free(t, h, s) \ 232 sh_memio_free((t), (h), (s)) 233 234 /* 235 * int bus_space_unmap(bus_space_tag_t t, 236 * bus_space_handle_t bsh, bus_size_t size); 237 * 238 * Unmap a region of bus space. 239 */ 240 void sh_memio_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t); 241 242 #define bus_space_unmap(t, h, s) \ 243 sh_memio_unmap((t), (h), (s)) 244 245 /* 246 * int bus_space_subregion(bus_space_tag_t t, 247 * bus_space_handle_t bsh, bus_size_t offset, bus_size_t size, 248 * bus_space_handle_t *nbshp); 249 * 250 * Get a new handle for a subregion of an already-mapped area of bus space. 251 */ 252 int sh_memio_subregion(bus_space_tag_t, bus_space_handle_t, 253 bus_size_t, bus_size_t, bus_space_handle_t *); 254 255 #define bus_space_subregion(t, h, o, s, nhp) \ 256 sh_memio_subregion((t), (h), (o), (s), (nhp)) 257 258 /* 259 * void bus_space_read_region_N(bus_space_tag_t tag, 260 * bus_space_handle_t bsh, bus_size_t offset, 261 * u_intN_t *addr, size_t count); 262 * 263 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 264 * described by tag/handle and starting at `offset' and copy into 265 * buffer provided. 266 */ 267 static __inline void bus_space_read_region_1(bus_space_tag_t, 268 bus_space_handle_t, bus_size_t, uint8_t *, bus_size_t); 269 static __inline void bus_space_read_region_2(bus_space_tag_t, 270 bus_space_handle_t, bus_size_t, uint16_t *, bus_size_t); 271 static __inline void bus_space_read_region_4(bus_space_tag_t, 272 bus_space_handle_t, bus_size_t, uint32_t *, bus_size_t); 273 274 void 275 bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, 276 bus_size_t offset, uint8_t *addr, bus_size_t count) 277 { 278 uint8_t *p = (uint8_t *)(bsh + offset); 279 280 while (count--) 281 *addr++ = *p++; 282 } 283 284 void 285 bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, 286 bus_size_t offset, uint16_t *addr, bus_size_t count) 287 { 288 uint16_t *p = (uint16_t *)(bsh + offset); 289 290 while (count--) 291 *addr++ = bswap16(*p++); 292 } 293 294 void 295 bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, 296 bus_size_t offset, uint32_t *addr, bus_size_t count) 297 { 298 uint32_t *p = (uint32_t *)(bsh + offset); 299 300 while (count--) 301 *addr++ = bswap32(*p++); 302 } 303 304 /* 305 * void bus_space_read_region_stream_N(bus_space_tag_t tag, 306 * bus_space_handle_t bsh, bus_size_t offset, 307 * u_intN_t *addr, size_t count); 308 * 309 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 310 * described by tag/handle and starting at `offset' and copy into 311 * buffer provided. 312 */ 313 static __inline void bus_space_read_region_stream_1(bus_space_tag_t, 314 bus_space_handle_t, bus_size_t, uint8_t *, bus_size_t); 315 static __inline void bus_space_read_region_stream_2(bus_space_tag_t, 316 bus_space_handle_t, bus_size_t, uint16_t *, bus_size_t); 317 static __inline void bus_space_read_region_stream_4(bus_space_tag_t, 318 bus_space_handle_t, bus_size_t, uint32_t *, bus_size_t); 319 320 void 321 bus_space_read_region_stream_1(bus_space_tag_t tag, bus_space_handle_t bsh, 322 bus_size_t offset, uint8_t *addr, bus_size_t count) 323 { 324 uint8_t *p = (uint8_t *)(bsh + offset); 325 326 while (count--) 327 *addr++ = *p++; 328 } 329 330 void 331 bus_space_read_region_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh, 332 bus_size_t offset, uint16_t *addr, bus_size_t count) 333 { 334 uint16_t *p = (uint16_t *)(bsh + offset); 335 336 while (count--) 337 *addr++ = *p++; 338 } 339 340 void 341 bus_space_read_region_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh, 342 bus_size_t offset, uint32_t *addr, bus_size_t count) 343 { 344 uint32_t *p = (uint32_t *)(bsh + offset); 345 346 while (count--) 347 *addr++ = *p++; 348 } 349 350 /* 351 * void bus_space_write_region_N(bus_space_tag_t tag, 352 * bus_space_handle_t bsh, bus_size_t offset, 353 * const u_intN_t *addr, size_t count); 354 * 355 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided 356 * to bus space described by tag/handle starting at `offset'. 357 */ 358 static __inline void bus_space_write_region_1(bus_space_tag_t, 359 bus_space_handle_t, bus_size_t, const uint8_t *, bus_size_t); 360 static __inline void bus_space_write_region_2(bus_space_tag_t, 361 bus_space_handle_t, bus_size_t, const uint16_t *, bus_size_t); 362 static __inline void bus_space_write_region_4(bus_space_tag_t, 363 bus_space_handle_t, bus_size_t, const uint32_t *, bus_size_t); 364 365 void 366 bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, 367 bus_size_t offset, const uint8_t *addr, bus_size_t count) 368 { 369 uint8_t *p = (uint8_t *)(bsh + offset); 370 371 while (count--) 372 *p++ = *addr++; 373 } 374 375 void 376 bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, 377 bus_size_t offset, const uint16_t *addr, bus_size_t count) 378 { 379 uint16_t *p = (uint16_t *)(bsh + offset); 380 381 while (count--) 382 *p++ = bswap16(*addr++); 383 } 384 385 void 386 bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, 387 bus_size_t offset, const uint32_t *addr, bus_size_t count) 388 { 389 uint32_t *p = (uint32_t *)(bsh + offset); 390 391 while (count--) 392 *p++ = bswap32(*addr++); 393 } 394 395 /* 396 * void bus_space_write_region_stream_N(bus_space_tag_t tag, 397 * bus_space_handle_t bsh, bus_size_t offset, 398 * const u_intN_t *addr, size_t count); 399 * 400 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided 401 * to bus space described by tag/handle starting at `offset'. 402 */ 403 static __inline void bus_space_write_region_stream_1(bus_space_tag_t, 404 bus_space_handle_t, bus_size_t, const uint8_t *, bus_size_t); 405 static __inline void bus_space_write_region_stream_2(bus_space_tag_t, 406 bus_space_handle_t, bus_size_t, const uint16_t *, bus_size_t); 407 static __inline void bus_space_write_region_stream_4(bus_space_tag_t, 408 bus_space_handle_t, bus_size_t, const uint32_t *, bus_size_t); 409 410 void 411 bus_space_write_region_stream_1(bus_space_tag_t tag, bus_space_handle_t bsh, 412 bus_size_t offset, const uint8_t *addr, bus_size_t count) 413 { 414 uint8_t *p = (uint8_t *)(bsh + offset); 415 416 while (count--) 417 *p++ = *addr++; 418 } 419 420 void 421 bus_space_write_region_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh, 422 bus_size_t offset, const uint16_t *addr, bus_size_t count) 423 { 424 uint16_t *p = (uint16_t *)(bsh + offset); 425 426 while (count--) 427 *p++ = *addr++; 428 } 429 430 void 431 bus_space_write_region_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh, 432 bus_size_t offset, const uint32_t *addr, bus_size_t count) 433 { 434 uint32_t *p = (uint32_t *)(bsh + offset); 435 436 while (count--) 437 *p++ = *addr++; 438 } 439 440 /* 441 * void bus_space_write_N(bus_space_tag_t tag, 442 * bus_space_handle_t bsh, bus_size_t offset, 443 * u_intN_t value); 444 * 445 * Write the 1, 2, 4, or 8 byte value `value' to bus space 446 * described by tag/handle/offset. 447 */ 448 static __inline void bus_space_write_1(bus_space_tag_t, 449 bus_space_handle_t, bus_size_t, uint8_t); 450 static __inline void bus_space_write_2(bus_space_tag_t, 451 bus_space_handle_t, bus_size_t, uint16_t); 452 static __inline void bus_space_write_4(bus_space_tag_t, 453 bus_space_handle_t, bus_size_t, uint32_t); 454 455 void 456 bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t bsh, 457 bus_size_t offset, uint8_t value) 458 { 459 460 *(volatile uint8_t *)(bsh + offset) = value; 461 } 462 463 void 464 bus_space_write_2(bus_space_tag_t tag, bus_space_handle_t bsh, 465 bus_size_t offset, uint16_t value) 466 { 467 468 *(volatile uint16_t *)(bsh + offset) = bswap16(value); 469 } 470 471 void 472 bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t bsh, 473 bus_size_t offset, uint32_t value) 474 { 475 476 *(volatile uint32_t *)(bsh + offset) = bswap32(value); 477 } 478 479 static __inline void bus_space_write_stream_2(bus_space_tag_t, 480 bus_space_handle_t, bus_size_t, uint16_t); 481 static __inline void bus_space_write_stream_4(bus_space_tag_t, 482 bus_space_handle_t, bus_size_t, uint32_t); 483 484 void 485 bus_space_write_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh, 486 bus_size_t offset, uint16_t value) 487 { 488 489 *(volatile uint16_t *)(bsh + offset) = value; 490 } 491 492 void 493 bus_space_write_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh, 494 bus_size_t offset, uint32_t value) 495 { 496 497 *(volatile uint32_t *)(bsh + offset) = value; 498 } 499 500 /* 501 * void bus_space_write_multi_N(bus_space_tag_t tag, 502 * bus_space_handle_t bsh, bus_size_t offset, 503 * const u_intN_t *addr, size_t count); 504 * 505 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 506 * provided to bus space described by tag/handle/offset. 507 */ 508 static __inline void bus_space_write_multi_1(bus_space_tag_t, 509 bus_space_handle_t, bus_size_t, const uint8_t *, bus_size_t); 510 static __inline void bus_space_write_multi_2(bus_space_tag_t, 511 bus_space_handle_t, bus_size_t, const uint16_t *, bus_size_t); 512 static __inline void bus_space_write_multi_4(bus_space_tag_t, 513 bus_space_handle_t, bus_size_t, const uint32_t *, bus_size_t); 514 515 void 516 bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, 517 bus_size_t offset, const uint8_t *addr, bus_size_t count) 518 { 519 520 while (count--) 521 bus_space_write_1(tag, bsh, offset, *addr++); 522 } 523 524 void 525 bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, 526 bus_size_t offset, const uint16_t *addr, bus_size_t count) 527 { 528 529 while (count--) 530 bus_space_write_2(tag, bsh, offset, *addr++); 531 } 532 533 void 534 bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, 535 bus_size_t offset, const uint32_t *addr, bus_size_t count) 536 { 537 538 while (count--) 539 bus_space_write_4(tag, bsh, offset, *addr++); 540 } 541 542 static __inline void bus_space_write_multi_stream_2(bus_space_tag_t, 543 bus_space_handle_t, bus_size_t, const uint16_t *, bus_size_t); 544 static __inline void bus_space_write_multi_stream_4(bus_space_tag_t, 545 bus_space_handle_t, bus_size_t, const uint32_t *, bus_size_t); 546 547 void 548 bus_space_write_multi_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh, 549 bus_size_t offset, const uint16_t *addr, bus_size_t count) 550 { 551 552 while (count--) 553 bus_space_write_stream_2(tag, bsh, offset, *addr++); 554 } 555 556 void 557 bus_space_write_multi_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh, 558 bus_size_t offset, const uint32_t *addr, bus_size_t count) 559 { 560 561 while (count--) 562 bus_space_write_stream_4(tag, bsh, offset, *addr++); 563 } 564 565 /* 566 * void bus_space_set_multi_N(bus_space_tag_t tag, 567 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 568 * size_t count); 569 * 570 * Write the 1, 2, 4, or 8 byte value `val' to bus space described 571 * by tag/handle/offset `count' times. 572 */ 573 static __inline void bus_space_set_multi_1(bus_space_tag_t, 574 bus_space_handle_t, bus_size_t, uint8_t, size_t); 575 static __inline void bus_space_set_multi_2(bus_space_tag_t, 576 bus_space_handle_t, bus_size_t, uint16_t, size_t); 577 static __inline void bus_space_set_multi_4(bus_space_tag_t, 578 bus_space_handle_t, bus_size_t, uint32_t, size_t); 579 580 void 581 bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, 582 bus_size_t offset, uint8_t val, size_t count) 583 { 584 585 while (count--) 586 bus_space_write_1(tag, bsh, offset, val); 587 } 588 589 void 590 bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, 591 bus_size_t offset, uint16_t val, size_t count) 592 { 593 594 while (count--) 595 bus_space_write_2(tag, bsh, offset, val); 596 } 597 598 void 599 bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, 600 bus_size_t offset, uint32_t val, size_t count) 601 { 602 603 while (count--) 604 bus_space_write_4(tag, bsh, offset, val); 605 } 606 607 /* 608 * void bus_space_set_region_N(bus_space_tag_t tag, 609 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 610 * size_t count); 611 * 612 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 613 * by tag/handle starting at `offset'. 614 */ 615 static __inline void bus_space_set_region_1(bus_space_tag_t, 616 bus_space_handle_t, bus_size_t, uint8_t, size_t); 617 static __inline void bus_space_set_region_2(bus_space_tag_t, 618 bus_space_handle_t, bus_size_t, uint16_t, size_t); 619 static __inline void bus_space_set_region_4(bus_space_tag_t, 620 bus_space_handle_t, bus_size_t, uint32_t, size_t); 621 622 void 623 bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, 624 bus_size_t offset, uint8_t val, size_t count) 625 { 626 volatile uint8_t *addr = (void *)(bsh + offset); 627 628 while (count--) 629 *addr++ = val; 630 } 631 632 void 633 bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, 634 bus_size_t offset, uint16_t val, size_t count) 635 { 636 volatile uint16_t *addr = (void *)(bsh + offset); 637 638 val = bswap16(val); 639 while (count--) 640 *addr++ = val; 641 } 642 643 void 644 bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, 645 bus_size_t offset, uint32_t val, size_t count) 646 { 647 volatile uint32_t *addr = (void *)(bsh + offset); 648 649 val = bswap32(val); 650 while (count--) 651 *addr++ = val; 652 } 653 654 /* 655 * void bus_space_set_region_stream_N(bus_space_tag_t tag, 656 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 657 * size_t count); 658 * 659 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 660 * by tag/handle starting at `offset'. 661 */ 662 static __inline void bus_space_set_region_stream_1(bus_space_tag_t, 663 bus_space_handle_t, bus_size_t, uint8_t, bus_size_t); 664 static __inline void bus_space_set_region_stream_2(bus_space_tag_t, 665 bus_space_handle_t, bus_size_t, uint16_t, bus_size_t); 666 static __inline void bus_space_set_region_stream_4(bus_space_tag_t, 667 bus_space_handle_t, bus_size_t, uint32_t, bus_size_t); 668 669 void 670 bus_space_set_region_stream_1(bus_space_tag_t tag, bus_space_handle_t bsh, 671 bus_size_t offset, uint8_t val, bus_size_t count) 672 { 673 volatile uint8_t *addr = (void *)(bsh + offset); 674 675 while (count--) 676 *addr++ = val; 677 } 678 679 void 680 bus_space_set_region_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh, 681 bus_size_t offset, uint16_t val, bus_size_t count) 682 { 683 volatile uint16_t *addr = (void *)(bsh + offset); 684 685 while (count--) 686 *addr++ = val; 687 } 688 689 void 690 bus_space_set_region_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh, 691 bus_size_t offset, uint32_t val, bus_size_t count) 692 { 693 volatile uint32_t *addr = (void *)(bsh + offset); 694 695 while (count--) 696 *addr++ = val; 697 } 698 699 /* 700 * void bus_space_copy_region_N(bus_space_tag_t tag, 701 * bus_space_handle_t bsh1, bus_size_t off1, 702 * bus_space_handle_t bsh2, bus_size_t off2, 703 * size_t count); 704 * 705 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 706 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 707 */ 708 static __inline void bus_space_copy_region_1(bus_space_tag_t, 709 bus_space_handle_t, bus_size_t, bus_space_handle_t, bus_size_t, 710 size_t); 711 static __inline void bus_space_copy_region_2(bus_space_tag_t, 712 bus_space_handle_t, bus_size_t, bus_space_handle_t, bus_size_t, 713 size_t); 714 static __inline void bus_space_copy_region_4(bus_space_tag_t, 715 bus_space_handle_t, bus_size_t, bus_space_handle_t, bus_size_t, 716 size_t); 717 718 void 719 bus_space_copy_region_1(bus_space_tag_t t, bus_space_handle_t h1, 720 bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, size_t c) 721 { 722 volatile uint8_t *addr1 = (void *)(h1 + o1); 723 volatile uint8_t *addr2 = (void *)(h2 + o2); 724 725 if (addr1 >= addr2) { /* src after dest: copy forward */ 726 while (c--) 727 *addr2++ = *addr1++; 728 } else { /* dest after src: copy backwards */ 729 addr1 += c - 1; 730 addr2 += c - 1; 731 while (c--) 732 *addr2-- = *addr1--; 733 } 734 } 735 736 void 737 bus_space_copy_region_2(bus_space_tag_t t, bus_space_handle_t h1, 738 bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, size_t c) 739 { 740 volatile uint16_t *addr1 = (void *)(h1 + o1); 741 volatile uint16_t *addr2 = (void *)(h2 + o2); 742 743 if (addr1 >= addr2) { /* src after dest: copy forward */ 744 while (c--) 745 *addr2++ = *addr1++; 746 } else { /* dest after src: copy backwards */ 747 addr1 += c - 1; 748 addr2 += c - 1; 749 while (c--) 750 *addr2-- = *addr1--; 751 } 752 } 753 754 void 755 bus_space_copy_region_4(bus_space_tag_t t, bus_space_handle_t h1, 756 bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, size_t c) 757 { 758 volatile uint32_t *addr1 = (void *)(h1 + o1); 759 volatile uint32_t *addr2 = (void *)(h2 + o2); 760 761 if (addr1 >= addr2) { /* src after dest: copy forward */ 762 while (c--) 763 *addr2++ = *addr1++; 764 } else { /* dest after src: copy backwards */ 765 addr1 += c - 1; 766 addr2 += c - 1; 767 while (c--) 768 *addr2-- = *addr1--; 769 } 770 } 771 772 /* 773 * Bus read/write barrier methods. 774 * 775 * void bus_space_barrier(bus_space_tag_t tag, 776 * bus_space_handle_t bsh, bus_size_t offset, 777 * bus_size_t len, int flags); 778 * 779 * Note: the sh3 does not currently require barriers, but we must 780 * provide the flags to MI code. 781 */ 782 #define bus_space_barrier(t, h, o, l, f) \ 783 ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f))) 784 785 #endif /* _SH3_BUS_FUNCS_H_ */ 786