1 /* $NetBSD: bus_space.h,v 1.8 2003/10/25 08:47:14 scw Exp $ */ 2 3 /*- 4 * Copyright (c) 1996, 1997, 1998 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 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the NetBSD 22 * Foundation, Inc. and its contributors. 23 * 4. Neither the name of The NetBSD Foundation nor the names of its 24 * contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 */ 39 40 /* 41 * Copyright (C) 1997 Scott Reynolds. All rights reserved. 42 * 43 * Redistribution and use in source and binary forms, with or without 44 * modification, are permitted provided that the following conditions 45 * are met: 46 * 1. Redistributions of source code must retain the above copyright 47 * notice, this list of conditions and the following disclaimer. 48 * 2. Redistributions in binary form must reproduce the above copyright 49 * notice, this list of conditions and the following disclaimer in the 50 * documentation and/or other materials provided with the distribution. 51 * 3. The name of the author may not be used to endorse or promote products 52 * derived from this software without specific prior written permission 53 * 54 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 55 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 56 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 57 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 58 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 59 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 60 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 61 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 62 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 63 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 64 */ 65 66 /* 67 * Lifted from the Next68k port. 68 * Modified for mvme68k by Steve Woodford. 69 * 70 * TODO: Support for VMEbus... 71 * (Do any existing VME card drivers use bus_space_* ?) 72 */ 73 74 #ifndef _MVME68K_BUS_SPACE_H_ 75 #define _MVME68K_BUS_SPACE_H_ 76 77 /* 78 * Addresses (in bus space). 79 */ 80 typedef u_long bus_addr_t; 81 typedef u_long bus_size_t; 82 83 /* 84 * Access methods for bus resources and address space. 85 */ 86 struct mvme68k_bus_space_tag; 87 typedef struct mvme68k_bus_space_tag *bus_space_tag_t; 88 typedef u_long bus_space_handle_t; 89 90 struct mvme68k_bus_space_tag { 91 void *bs_cookie; 92 int (*bs_map)(void *, bus_addr_t, bus_size_t, 93 int, bus_space_handle_t *); 94 void (*bs_unmap)(void *, bus_space_handle_t, bus_size_t); 95 int (*bs_peek_1)(void *, bus_space_handle_t, 96 bus_size_t, u_int8_t *); 97 int (*bs_peek_2)(void *, bus_space_handle_t, 98 bus_size_t, u_int16_t *); 99 int (*bs_peek_4)(void *, bus_space_handle_t, 100 bus_size_t, u_int32_t *); 101 #if 0 102 int (*bs_peek_8)(void *, bus_space_handle_t, 103 bus_size_t, u_int64_t *); 104 #endif 105 int (*bs_poke_1)(void *, bus_space_handle_t, 106 bus_size_t, u_int8_t); 107 int (*bs_poke_2)(void *, bus_space_handle_t, 108 bus_size_t, u_int16_t); 109 int (*bs_poke_4)(void *, bus_space_handle_t, 110 bus_size_t, u_int32_t); 111 #if 0 112 int (*bs_poke_8)(void *, bus_space_handle_t, 113 bus_size_t, u_int64_t); 114 #endif 115 }; 116 117 /* 118 * int bus_space_map(bus_space_tag_t t, bus_addr_t addr, 119 * bus_size_t size, int flags, 120 * bus_space_handle_t *bshp); 121 * 122 * Map a region of bus space. 123 */ 124 #define bus_space_map(tag, offset, size, flags, handlep) \ 125 (*((tag)->bs_map))((tag)->bs_cookie, (offset), (size), (flags), (handlep)) 126 127 /* 128 * Possible values for the 'flags' parameter of bus_space_map() 129 */ 130 #define BUS_SPACE_MAP_CACHEABLE 0x01 131 #define BUS_SPACE_MAP_LINEAR 0x02 132 #define BUS_SPACE_MAP_PREFETCHABLE 0x04 133 134 /* 135 * void bus_space_unmap(bus_space_tag_t t, 136 * bus_space_handle_t bsh, bus_size_t size); 137 * 138 * Unmap a region of bus space. 139 */ 140 #define bus_space_unmap(tag, handle, size) \ 141 (*((tag)->bs_unmap))((tag)->bs_cookie, (handle), (size)) 142 143 /* 144 * int bus_space_subregion(bus_space_tag_t t, bus_space_handle_t h 145 * bus_addr_t offset, bus_size_t size, bus_space_handle_t *newh); 146 * 147 * Allocate a sub-region of an existing map 148 */ 149 #define bus_space_subregion(t, h, o, s, hp) \ 150 ((*(hp)=(h)+(o)), 0) 151 152 /* 153 * Allocation and deallocation operations. 154 */ 155 #define bus_space_alloc(t, rs, re, s, a, b, f, ap, hp) \ 156 (-1) 157 158 #define bus_space_free(t, h, s) 159 160 /* 161 * int bus_space_peek_N(bus_space_tag_t tag, 162 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t *valuep); 163 * 164 * Cautiously read 1, 2, 4 or 8 byte quantity from bus space described 165 * by tag/handle/offset. 166 * If no hardware responds to the read access, the function returns a 167 * non-zero value. Otherwise the value read is placed in `valuep'. 168 */ 169 #define bus_space_peek_1(t, h, o, vp) \ 170 (*((t)->bs_peek_1))((t)->bs_cookie, (h), (o), (vp)) 171 172 #define bus_space_peek_2(t, h, o, vp) \ 173 (*((t)->bs_peek_2))((t)->bs_cookie, (h), (o), (vp)) 174 175 #define bus_space_peek_4(t, h, o, vp) \ 176 (*((t)->bs_peek_4))((t)->bs_cookie, (h), (o), (vp)) 177 178 #if 0 /* Cause a link error for bus_space_peek_8 */ 179 #define bus_space_peek_8(t, h, o, vp) \ 180 (*((t)->bs_peek_8))((t)->bs_cookie, (h), (o), (vp)) 181 #endif 182 183 /* 184 * int bus_space_poke_N(bus_space_tag_t tag, 185 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t value); 186 * 187 * Cautiously write 1, 2, 4 or 8 byte quantity to bus space described 188 * by tag/handle/offset. 189 * If no hardware responds to the write access, the function returns a 190 * non-zero value. 191 */ 192 #define bus_space_poke_1(t, h, o, v) \ 193 (*((t)->bs_poke_1))((t)->bs_cookie, (h), (o), (v)) 194 195 #define bus_space_poke_2(t, h, o, v) \ 196 (*((t)->bs_poke_2))((t)->bs_cookie, (h), (o), (v)) 197 198 #define bus_space_poke_4(t, h, o, v) \ 199 (*((t)->bs_poke_4))((t)->bs_cookie, (h), (o), (v)) 200 201 #if 0 /* Cause a link error for bus_space_poke_8 */ 202 #define bus_space_poke_8(t, h, o, v) \ 203 (*((t)->bs_poke_8))((t)->bs_cookie, (h), (o), (v)) 204 #endif 205 206 /* 207 * u_intN_t bus_space_read_N(bus_space_tag_t tag, 208 * bus_space_handle_t bsh, bus_size_t offset); 209 * 210 * Read a 1, 2, 4, or 8 byte quantity from bus space 211 * described by tag/handle/offset. 212 */ 213 #define bus_space_read_1(t,h,o) \ 214 (*((volatile u_int8_t *)(intptr_t)((h) + (o)))) 215 #define bus_space_read_2(t,h,o) \ 216 (*((volatile u_int16_t *)(intptr_t)((h) + (o)))) 217 #define bus_space_read_4(t,h,o) \ 218 (*((volatile u_int32_t *)(intptr_t)((h) + (o)))) 219 220 /* 221 * void bus_space_read_multi_N(bus_space_tag_t tag, 222 * bus_space_handle_t bsh, bus_size_t offset, 223 * u_intN_t *addr, size_t count); 224 * 225 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 226 * described by tag/handle/offset and copy into buffer provided. 227 */ 228 229 #define bus_space_read_multi_1(t, h, o, a, c) do { \ 230 (void) t; \ 231 __asm __volatile (" \ 232 movl %0,%%a0 ; \ 233 movl %1,%%a1 ; \ 234 movl %2,%%d0 ; \ 235 1: movb %%a0@,%%a1@+ ; \ 236 subql #1,%%d0 ; \ 237 jne 1b" : \ 238 : \ 239 "r" ((h) + (o)), "g" (a), "g" (c) : \ 240 "a0","a1","d0"); \ 241 } while (0); 242 243 #define bus_space_read_multi_2(t, h, o, a, c) do { \ 244 (void) t; \ 245 __asm __volatile (" \ 246 movl %0,%%a0 ; \ 247 movl %1,%%a1 ; \ 248 movl %2,%%d0 ; \ 249 1: movw %%a0@,%%a1@+ ; \ 250 subql #1,%%d0 ; \ 251 jne 1b" : \ 252 : \ 253 "r" ((h) + (o)), "g" (a), "g" (c) : \ 254 "a0","a1","d0"); \ 255 } while (0); 256 257 #define bus_space_read_multi_4(t, h, o, a, c) do { \ 258 (void) t; \ 259 __asm __volatile (" \ 260 movl %0,%%a0 ; \ 261 movl %1,%%a1 ; \ 262 movl %2,%%d0 ; \ 263 1: movl %%a0@,%%a1@+ ; \ 264 subql #1,%%d0 ; \ 265 jne 1b" : \ 266 : \ 267 "r" ((h) + (o)), "g" (a), "g" (c) : \ 268 "a0","a1","d0"); \ 269 } while (0); 270 271 #if 0 /* Cause a link error for bus_space_read_multi_8 */ 272 #define bus_space_read_multi_8 !!! bus_space_read_multi_8 unimplemented !!! 273 #endif 274 275 /* 276 * void bus_space_read_region_N(bus_space_tag_t tag, 277 * bus_space_handle_t bsh, bus_size_t offset, 278 * u_intN_t *addr, size_t count); 279 * 280 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 281 * described by tag/handle and starting at `offset' and copy into 282 * buffer provided. 283 */ 284 285 #define bus_space_read_region_1(t, h, o, a, c) do { \ 286 (void) t; \ 287 __asm __volatile (" \ 288 movl %0,%%a0 ; \ 289 movl %1,%%a1 ; \ 290 movl %2,%%d0 ; \ 291 1: movb %%a0@+,%%a1@+ ; \ 292 subql #1,%%d0 ; \ 293 jne 1b" : \ 294 : \ 295 "r" ((h) + (o)), "g" (a), "g" (c) : \ 296 "a0","a1","d0"); \ 297 } while (0); 298 299 #define bus_space_read_region_2(t, h, o, a, c) do { \ 300 (void) t; \ 301 __asm __volatile (" \ 302 movl %0,%%a0 ; \ 303 movl %1,%%a1 ; \ 304 movl %2,%%d0 ; \ 305 1: movw %%a0@+,%%a1@+ ; \ 306 subql #1,%%d0 ; \ 307 jne 1b" : \ 308 : \ 309 "r" ((h) + (o)), "g" (a), "g" (c) : \ 310 "a0","a1","d0"); \ 311 } while (0); 312 313 #define bus_space_read_region_4(t, h, o, a, c) do { \ 314 (void) t; \ 315 __asm __volatile (" \ 316 movl %0,%%a0 ; \ 317 movl %1,%%a1 ; \ 318 movl %2,%%d0 ; \ 319 1: movl %%a0@+,%%a1@+ ; \ 320 subql #1,%%d0 ; \ 321 jne 1b" : \ 322 : \ 323 "r" ((h) + (o)), "g" (a), "g" (c) : \ 324 "a0","a1","d0"); \ 325 } while (0); 326 327 #if 0 /* Cause a link error for bus_space_read_region_8 */ 328 #define bus_space_read_region_8 !!! bus_space_read_region_8 unimplemented !!! 329 #endif 330 331 /* 332 * void bus_space_write_N(bus_space_tag_t tag, 333 * bus_space_handle_t bsh, bus_size_t offset, 334 * u_intN_t value); 335 * 336 * Write the 1, 2, 4, or 8 byte value `value' to bus space 337 * described by tag/handle/offset. 338 */ 339 #define bus_space_write_1(t,h,o,v) \ 340 do { \ 341 *((volatile u_int8_t *)(intptr_t)((h) + (o))) = (v); \ 342 } while (/*CONSTCOND*/0) 343 #define bus_space_write_2(t,h,o,v) \ 344 do { \ 345 *((volatile u_int16_t *)(intptr_t)((h) + (o))) = (v); \ 346 } while (/*CONSTCOND*/0) 347 #define bus_space_write_4(t,h,o,v) \ 348 do { \ 349 *((volatile u_int32_t *)(intptr_t)((h) + (o))) = (v); \ 350 } while (/*CONSTCOND*/0) 351 352 /* 353 * void bus_space_write_multi_N(bus_space_tag_t tag, 354 * bus_space_handle_t bsh, bus_size_t offset, 355 * const u_intN_t *addr, size_t count); 356 * 357 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 358 * provided to bus space described by tag/handle/offset. 359 */ 360 361 #define bus_space_write_multi_1(t, h, o, a, c) do { \ 362 (void) t; \ 363 __asm __volatile (" \ 364 movl %0,%%a0 ; \ 365 movl %1,%%a1 ; \ 366 movl %2,%%d0 ; \ 367 1: movb %%a1@+,%%a0@ ; \ 368 subql #1,%%d0 ; \ 369 jne 1b" : \ 370 : \ 371 "r" ((h) + (o)), "g" (a), "g" (c) : \ 372 "a0","a1","d0"); \ 373 } while (0); 374 375 #define bus_space_write_multi_2(t, h, o, a, c) do { \ 376 (void) t; \ 377 __asm __volatile (" \ 378 movl %0,%%a0 ; \ 379 movl %1,%%a1 ; \ 380 movl %2,%%d0 ; \ 381 1: movw %%a1@+,%%a0@ ; \ 382 subql #1,%%d0 ; \ 383 jne 1b" : \ 384 : \ 385 "r" ((h) + (o)), "g" (a), "g" (c) : \ 386 "a0","a1","d0"); \ 387 } while (0); 388 389 #define bus_space_write_multi_4(t, h, o, a, c) do { \ 390 (void) t; \ 391 __asm __volatile (" \ 392 movl %0,%%a0 ; \ 393 movl %1,%%a1 ; \ 394 movl %2,%%d0 ; \ 395 1: movl a1@+,%%a0@ ; \ 396 subql #1,%%d0 ; \ 397 jne 1b" : \ 398 : \ 399 "r" ((h) + (o)), "g" (a), "g" (c) : \ 400 "a0","a1","d0"); \ 401 } while (0); 402 403 #if 0 /* Cause a link error for bus_space_write_8 */ 404 #define bus_space_write_multi_8(t, h, o, a, c) \ 405 !!! bus_space_write_multi_8 unimplimented !!! 406 #endif 407 408 /* 409 * void bus_space_write_region_N(bus_space_tag_t tag, 410 * bus_space_handle_t bsh, bus_size_t offset, 411 * const u_intN_t *addr, size_t count); 412 * 413 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided 414 * to bus space described by tag/handle starting at `offset'. 415 */ 416 417 #define bus_space_write_region_1(t, h, o, a, c) do { \ 418 (void) t; \ 419 __asm __volatile (" \ 420 movl %0,%%a0 ; \ 421 movl %1,%%a1 ; \ 422 movl %2,%%d0 ; \ 423 1: movb %%a1@+,%%a0@+ ; \ 424 subql #1,%%d0 ; \ 425 jne 1b" : \ 426 : \ 427 "r" ((h) + (o)), "g" (a), "g" (c) : \ 428 "a0","a1","d0"); \ 429 } while (0); 430 431 #define bus_space_write_region_2(t, h, o, a, c) do { \ 432 (void) t; \ 433 __asm __volatile (" \ 434 movl %0,%%a0 ; \ 435 movl %1,%%a1 ; \ 436 movl %2,%%d0 ; \ 437 1: movw %%a1@+,%%a0@+ ; \ 438 subql #1,%%d0 ; \ 439 jne 1b" : \ 440 : \ 441 "r" ((h) + (o)), "g" (a), "g" (c) : \ 442 "a0","a1","d0"); \ 443 } while (0); 444 445 #define bus_space_write_region_4(t, h, o, a, c) do { \ 446 (void) t; \ 447 __asm __volatile (" \ 448 movl %0,%%a0 ; \ 449 movl %1,%%a1 ; \ 450 movl %2,%%d0 ; \ 451 1: movl %%a1@+,%%a0@+ ; \ 452 subql #1,%%d0 ; \ 453 jne 1b" : \ 454 : \ 455 "r" ((h) + (o)), "g" (a), "g" (c) : \ 456 "a0","a1","d0"); \ 457 } while (0); 458 459 #if 0 /* Cause a link error for bus_space_write_region_8 */ 460 #define bus_space_write_region_8 \ 461 !!! bus_space_write_region_8 unimplemented !!! 462 #endif 463 464 /* 465 * void bus_space_set_multi_N(bus_space_tag_t tag, 466 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 467 * size_t count); 468 * 469 * Write the 1, 2, 4, or 8 byte value `val' to bus space described 470 * by tag/handle/offset `count' times. 471 */ 472 473 #define bus_space_set_multi_1(t, h, o, val, c) do { \ 474 (void) t; \ 475 __asm __volatile (" \ 476 movl %0,%%a0 ; \ 477 movl %1,%%d1 ; \ 478 movl %2,%%d0 ; \ 479 1: movb %%d1,%%a0@ ; \ 480 subql #1,%%d0 ; \ 481 jne 1b" : \ 482 : \ 483 "r" ((h) + (o)), "g" (val), "g" (c) : \ 484 "a0","d0","d1"); \ 485 } while (0); 486 487 #define bus_space_set_multi_2(t, h, o, val, c) do { \ 488 (void) t; \ 489 __asm __volatile (" \ 490 movl %0,%%a0 ; \ 491 movl %1,%%d1 ; \ 492 movl %2,%%d0 ; \ 493 1: movw %%d1,%%a0@ ; \ 494 subql #1,%%d0 ; \ 495 jne 1b" : \ 496 : \ 497 "r" ((h) + (o)), "g" (val), "g" (c) : \ 498 "a0","d0","d1"); \ 499 } while (0); 500 501 #define bus_space_set_multi_4(t, h, o, val, c) do { \ 502 (void) t; \ 503 __asm __volatile (" \ 504 movl %0,%%a0 ; \ 505 movl %1,%%d1 ; \ 506 movl %2,%%d0 ; \ 507 1: movl %%d1,%%a0@ ; \ 508 subql #1,%%d0 ; \ 509 jne 1b" : \ 510 : \ 511 "r" ((h) + (o)), "g" (val), "g" (c) : \ 512 "a0","d0","d1"); \ 513 } while (0); 514 515 #if 0 /* Cause a link error for bus_space_set_multi_8 */ 516 #define bus_space_set_multi_8 \ 517 !!! bus_space_set_multi_8 unimplemented !!! 518 #endif 519 520 /* 521 * void bus_space_set_region_N(bus_space_tag_t tag, 522 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 523 * size_t count); 524 * 525 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 526 * by tag/handle starting at `offset'. 527 */ 528 529 #define bus_space_set_region_1(t, h, o, val, c) do { \ 530 (void) t; \ 531 __asm __volatile (" \ 532 movl %0,%%a0 ; \ 533 movl %1,%%d1 ; \ 534 movl %2,%%d0 ; \ 535 1: movb %%d1,%%a0@+ ; \ 536 subql #1,%%d0 ; \ 537 jne 1b" : \ 538 : \ 539 "r" ((h) + (o)), "g" (val), "g" (c) : \ 540 "a0","d0","d1"); \ 541 } while (0); 542 543 #define bus_space_set_region_2(t, h, o, val, c) do { \ 544 (void) t; \ 545 __asm __volatile (" \ 546 movl %0,%%a0 ; \ 547 movl %1,%%d1 ; \ 548 movl %2,%%d0 ; \ 549 1: movw %%d1,%%a0@+ ; \ 550 subql #1,%%d0 ; \ 551 jne 1b" : \ 552 : \ 553 "r" ((h) + (o)), "g" (val), "g" (c) : \ 554 "a0","d0","d1"); \ 555 } while (0); 556 557 #define bus_space_set_region_4(t, h, o, val, c) do { \ 558 (void) t; \ 559 __asm __volatile (" \ 560 movl %0,%%a0 ; \ 561 movl %1,%%d1 ; \ 562 movl %2,%%d0 ; \ 563 1: movl d1,%%a0@+ ; \ 564 subql #1,%%d0 ; \ 565 jne 1b" : \ 566 : \ 567 "r" ((h) + (o)), "g" (val), "g" (c) : \ 568 "a0","d0","d1"); \ 569 } while (0); 570 571 #if 0 /* Cause a link error for bus_space_set_region_8 */ 572 #define bus_space_set_region_8 \ 573 !!! bus_space_set_region_8 unimplemented !!! 574 #endif 575 576 /* 577 * void bus_space_copy_N(bus_space_tag_t tag, 578 * bus_space_handle_t bsh1, bus_size_t off1, 579 * bus_space_handle_t bsh2, bus_size_t off2, 580 * size_t count); 581 * 582 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 583 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 584 */ 585 586 #define __MVME68K_copy_region_N(BYTES) \ 587 static __inline void __CONCAT(bus_space_copy_region_,BYTES) \ 588 __P((bus_space_tag_t, \ 589 bus_space_handle_t bsh1, bus_size_t off1, \ 590 bus_space_handle_t bsh2, bus_size_t off2, \ 591 bus_size_t count)); \ 592 \ 593 static __inline void \ 594 __CONCAT(bus_space_copy_region_,BYTES)(t, h1, o1, h2, o2, c) \ 595 bus_space_tag_t t; \ 596 bus_space_handle_t h1, h2; \ 597 bus_size_t o1, o2, c; \ 598 { \ 599 bus_size_t o; \ 600 \ 601 if ((h1 + o1) >= (h2 + o2)) { \ 602 /* src after dest: copy forward */ \ 603 for (o = 0; c != 0; c--, o += BYTES) \ 604 __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \ 605 __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \ 606 } else { \ 607 /* dest after src: copy backwards */ \ 608 for (o = (c - 1) * BYTES; c != 0; c--, o -= BYTES) \ 609 __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \ 610 __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \ 611 } \ 612 } 613 __MVME68K_copy_region_N(1) 614 __MVME68K_copy_region_N(2) 615 __MVME68K_copy_region_N(4) 616 #if 0 /* Cause a link error for bus_space_copy_8 */ 617 #define bus_space_copy_8 \ 618 !!! bus_space_copy_8 unimplemented !!! 619 #endif 620 621 #undef __MVME68K_copy_region_N 622 623 /* 624 * Bus read/write barrier methods. 625 * 626 * void bus_space_barrier(bus_space_tag_t tag, 627 * bus_space_handle_t bsh, bus_size_t offset, 628 * bus_size_t len, int flags); 629 * 630 * Note: the 680x0 does not currently require barriers, but we must 631 * provide the flags to MI code. 632 */ 633 #define bus_space_barrier(t, h, o, l, f) \ 634 ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f))) 635 #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ 636 #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ 637 638 #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) 639 640 641 #ifdef _MVME68K_BUS_SPACE_PRIVATE 642 extern int _bus_space_map(void *, bus_addr_t, bus_size_t, 643 int, bus_space_handle_t *); 644 extern void _bus_space_unmap(void *, bus_space_handle_t, bus_size_t); 645 extern int _bus_space_peek_1(void *, bus_space_handle_t, 646 bus_size_t, u_int8_t *); 647 extern int _bus_space_peek_2(void *, bus_space_handle_t, 648 bus_size_t, u_int16_t *); 649 extern int _bus_space_peek_4(void *, bus_space_handle_t, 650 bus_size_t, u_int32_t *); 651 extern int _bus_space_poke_1(void *, bus_space_handle_t, bus_size_t, u_int8_t); 652 extern int _bus_space_poke_2(void *, bus_space_handle_t, bus_size_t, u_int16_t); 653 extern int _bus_space_poke_4(void *, bus_space_handle_t, bus_size_t, u_int32_t); 654 #endif /* _MVME68K_BUS_SPACE_PRIVATE */ 655 656 #endif /* _MVME68K_BUS_SPACE_H_ */ 657