1 /* $NetBSD: bus.h,v 1.15 2002/04/14 07:59:59 takemura Exp $ */ 2 3 /*- 4 * Copyright (c) 1996, 1997, 1998, 2001 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) 1996 Charles M. Hannum. All rights reserved. 42 * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. 43 * 44 * Redistribution and use in source and binary forms, with or without 45 * modification, are permitted provided that the following conditions 46 * are met: 47 * 1. Redistributions of source code must retain the above copyright 48 * notice, this list of conditions and the following disclaimer. 49 * 2. Redistributions in binary form must reproduce the above copyright 50 * notice, this list of conditions and the following disclaimer in the 51 * documentation and/or other materials provided with the distribution. 52 * 3. All advertising materials mentioning features or use of this software 53 * must display the following acknowledgement: 54 * This product includes software developed by Christopher G. Demetriou 55 * for the NetBSD Project. 56 * 4. The name of the author may not be used to endorse or promote products 57 * derived from this software without specific prior written permission 58 * 59 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 60 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 61 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 62 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 63 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 64 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 65 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 66 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 67 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 68 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 69 */ 70 71 /* 72 * derived from arch/arm/include/bus.h Rev. 1.3 73 */ 74 75 #ifndef _SYS_BUS_H_ 76 #define _SYS_BUS_H_ 77 78 #include <machine/bus_types.h> 79 80 #ifndef BUS_SPACE_MD_CALLS 81 82 #define BUS_SPACE_MAP_CACHEABLE 0x01 83 #define BUS_SPACE_MAP_LINEAR 0x02 84 #define BUS_SPACE_MAP_PREFETCHABLE 0x04 85 86 #define BUS_SPACE_BARRIER_READ 0x01 87 #define BUS_SPACE_BARRIER_WRITE 0x02 88 89 #ifndef BUS_SPACE_MD_TYPES 90 typedef struct bus_space_tag *bus_space_tag_t; 91 #endif 92 93 /* 94 * bus space operaion table 95 */ 96 struct bus_space_ops { 97 /* mapping/unmapping */ 98 int (*bs_map)(bus_space_tag_t, bus_addr_t, bus_size_t, 99 int, bus_space_handle_t *); 100 void (*bs_unmap)(bus_space_tag_t, bus_space_handle_t, bus_size_t); 101 int (*bs_subregion)(bus_space_tag_t, bus_space_handle_t, 102 bus_size_t, bus_size_t, bus_space_handle_t *); 103 104 /* allocation/deallocation */ 105 int (*bs_alloc)(bus_space_tag_t, bus_addr_t, 106 bus_addr_t, bus_size_t, bus_size_t, bus_size_t, 107 int, bus_addr_t *, bus_space_handle_t *); 108 void (*bs_free)(bus_space_tag_t, bus_space_handle_t, bus_size_t); 109 110 /* get kernel virtual address */ 111 void * (*bs_vaddr)(bus_space_tag_t, bus_space_handle_t); 112 113 /* mmap bus space for user */ 114 paddr_t (*bs_mmap)(bus_space_tag_t, bus_addr_t, off_t, int, int); 115 116 /* barrier */ 117 void (*bs_barrier)(bus_space_tag_t, bus_space_handle_t, 118 bus_size_t, bus_size_t, int); 119 120 /* probe */ 121 int (*bs_peek)(bus_space_tag_t, bus_space_handle_t, 122 bus_size_t, size_t, void *); 123 int (*bs_poke)(bus_space_tag_t, bus_space_handle_t, 124 bus_size_t, size_t, u_int32_t); 125 126 /* read (single) */ 127 u_int8_t (*bs_r_1)(bus_space_tag_t, bus_space_handle_t, bus_size_t); 128 u_int16_t (*bs_r_2)(bus_space_tag_t, bus_space_handle_t, bus_size_t); 129 u_int32_t (*bs_r_4)(bus_space_tag_t, bus_space_handle_t, bus_size_t); 130 u_int64_t (*bs_r_8)(bus_space_tag_t, bus_space_handle_t, bus_size_t); 131 132 /* read multiple */ 133 void (*bs_rm_1)(bus_space_tag_t, bus_space_handle_t, 134 bus_size_t, u_int8_t *, bus_size_t); 135 void (*bs_rm_2)(bus_space_tag_t, bus_space_handle_t, 136 bus_size_t, u_int16_t *, bus_size_t); 137 void (*bs_rm_4)(bus_space_tag_t, bus_space_handle_t, 138 bus_size_t, u_int32_t *, bus_size_t); 139 void (*bs_rm_8)(bus_space_tag_t, bus_space_handle_t, 140 bus_size_t, u_int64_t *, bus_size_t); 141 142 /* read region */ 143 void (*bs_rr_1)(bus_space_tag_t, bus_space_handle_t, 144 bus_size_t, u_int8_t *, bus_size_t); 145 void (*bs_rr_2)(bus_space_tag_t, bus_space_handle_t, 146 bus_size_t, u_int16_t *, bus_size_t); 147 void (*bs_rr_4)(bus_space_tag_t, bus_space_handle_t, 148 bus_size_t, u_int32_t *, bus_size_t); 149 void (*bs_rr_8)(bus_space_tag_t, bus_space_handle_t, 150 bus_size_t, u_int64_t *, bus_size_t); 151 152 /* write (single) */ 153 void (*bs_w_1)(bus_space_tag_t, bus_space_handle_t, 154 bus_size_t, u_int8_t); 155 void (*bs_w_2)(bus_space_tag_t, bus_space_handle_t, 156 bus_size_t, u_int16_t); 157 void (*bs_w_4)(bus_space_tag_t, bus_space_handle_t, 158 bus_size_t, u_int32_t); 159 void (*bs_w_8)(bus_space_tag_t, bus_space_handle_t, 160 bus_size_t, u_int64_t); 161 162 /* write multiple */ 163 void (*bs_wm_1)(bus_space_tag_t, bus_space_handle_t, 164 bus_size_t, const u_int8_t *, bus_size_t); 165 void (*bs_wm_2)(bus_space_tag_t, bus_space_handle_t, 166 bus_size_t, const u_int16_t *, bus_size_t); 167 void (*bs_wm_4)(bus_space_tag_t, bus_space_handle_t, 168 bus_size_t, const u_int32_t *, bus_size_t); 169 void (*bs_wm_8)(bus_space_tag_t, bus_space_handle_t, 170 bus_size_t, const u_int64_t *, bus_size_t); 171 172 /* write region */ 173 void (*bs_wr_1)(bus_space_tag_t, bus_space_handle_t, 174 bus_size_t, const u_int8_t *, bus_size_t); 175 void (*bs_wr_2)(bus_space_tag_t, bus_space_handle_t, 176 bus_size_t, const u_int16_t *, bus_size_t); 177 void (*bs_wr_4)(bus_space_tag_t, bus_space_handle_t, 178 bus_size_t, const u_int32_t *, bus_size_t); 179 void (*bs_wr_8)(bus_space_tag_t, bus_space_handle_t, 180 bus_size_t, const u_int64_t *, bus_size_t); 181 182 #ifdef BUS_SPACE_HAS_REAL_STREAM_METHODS 183 /* read (single) stream */ 184 u_int8_t (*bs_rs_1)(bus_space_tag_t, bus_space_handle_t, bus_size_t); 185 u_int16_t (*bs_rs_2)(bus_space_tag_t, bus_space_handle_t, bus_size_t); 186 u_int32_t (*bs_rs_4)(bus_space_tag_t, bus_space_handle_t, bus_size_t); 187 u_int64_t (*bs_rs_8)(bus_space_tag_t, bus_space_handle_t, bus_size_t); 188 189 /* read multiple stream */ 190 void (*bs_rms_1)(bus_space_tag_t, bus_space_handle_t, 191 bus_size_t, u_int8_t *, bus_size_t); 192 void (*bs_rms_2)(bus_space_tag_t, bus_space_handle_t, 193 bus_size_t, u_int16_t *, bus_size_t); 194 void (*bs_rms_4)(bus_space_tag_t, bus_space_handle_t, 195 bus_size_t, u_int32_t *, bus_size_t); 196 void (*bs_rms_8)(bus_space_tag_t, bus_space_handle_t, 197 bus_size_t, u_int64_t *, bus_size_t); 198 199 /* read region stream */ 200 void (*bs_rrs_1)(bus_space_tag_t, bus_space_handle_t, 201 bus_size_t, u_int8_t *, bus_size_t); 202 void (*bs_rrs_2)(bus_space_tag_t, bus_space_handle_t, 203 bus_size_t, u_int16_t *, bus_size_t); 204 void (*bs_rrs_4)(bus_space_tag_t, bus_space_handle_t, 205 bus_size_t, u_int32_t *, bus_size_t); 206 void (*bs_rrs_8)(bus_space_tag_t, bus_space_handle_t, 207 bus_size_t, u_int64_t *, bus_size_t); 208 209 /* write (single) stream */ 210 void (*bs_ws_1)(bus_space_tag_t, bus_space_handle_t, 211 bus_size_t, u_int8_t); 212 void (*bs_ws_2)(bus_space_tag_t, bus_space_handle_t, 213 bus_size_t, u_int16_t); 214 void (*bs_ws_4)(bus_space_tag_t, bus_space_handle_t, 215 bus_size_t, u_int32_t); 216 void (*bs_ws_8)(bus_space_tag_t, bus_space_handle_t, 217 bus_size_t, u_int64_t); 218 219 /* write multiple stream */ 220 void (*bs_wms_1)(bus_space_tag_t, bus_space_handle_t, 221 bus_size_t, const u_int8_t *, bus_size_t); 222 void (*bs_wms_2)(bus_space_tag_t, bus_space_handle_t, 223 bus_size_t, const u_int16_t *, bus_size_t); 224 void (*bs_wms_4)(bus_space_tag_t, bus_space_handle_t, 225 bus_size_t, const u_int32_t *, bus_size_t); 226 void (*bs_wms_8)(bus_space_tag_t, bus_space_handle_t, 227 bus_size_t, const u_int64_t *, bus_size_t); 228 229 /* write region stream */ 230 void (*bs_wrs_1)(bus_space_tag_t, bus_space_handle_t, 231 bus_size_t, const u_int8_t *, bus_size_t); 232 void (*bs_wrs_2)(bus_space_tag_t, bus_space_handle_t, 233 bus_size_t, const u_int16_t *, bus_size_t); 234 void (*bs_wrs_4)(bus_space_tag_t, bus_space_handle_t, 235 bus_size_t, const u_int32_t *, bus_size_t); 236 void (*bs_wrs_8)(bus_space_tag_t, bus_space_handle_t, 237 bus_size_t, const u_int64_t *, bus_size_t); 238 #endif /* BUS_SPACE_HAS_REAL_STREAM_METHODS */ 239 240 /* set multiple */ 241 void (*bs_sm_1)(bus_space_tag_t, bus_space_handle_t, 242 bus_size_t, u_int8_t, bus_size_t); 243 void (*bs_sm_2)(bus_space_tag_t, bus_space_handle_t, 244 bus_size_t, u_int16_t, bus_size_t); 245 void (*bs_sm_4)(bus_space_tag_t, bus_space_handle_t, 246 bus_size_t, u_int32_t, bus_size_t); 247 void (*bs_sm_8)(bus_space_tag_t, bus_space_handle_t, 248 bus_size_t, u_int64_t, bus_size_t); 249 250 /* set region */ 251 void (*bs_sr_1)(bus_space_tag_t, bus_space_handle_t, 252 bus_size_t, u_int8_t, bus_size_t); 253 void (*bs_sr_2)(bus_space_tag_t, bus_space_handle_t, 254 bus_size_t, u_int16_t, bus_size_t); 255 void (*bs_sr_4)(bus_space_tag_t, bus_space_handle_t, 256 bus_size_t, u_int32_t, bus_size_t); 257 void (*bs_sr_8)(bus_space_tag_t, bus_space_handle_t, 258 bus_size_t, u_int64_t, bus_size_t); 259 260 /* copy */ 261 void (*bs_c_1)(bus_space_tag_t, bus_space_handle_t, bus_size_t, 262 bus_space_handle_t, bus_size_t, bus_size_t); 263 void (*bs_c_2)(bus_space_tag_t, bus_space_handle_t, bus_size_t, 264 bus_space_handle_t, bus_size_t, bus_size_t); 265 void (*bs_c_4)(bus_space_tag_t, bus_space_handle_t, bus_size_t, 266 bus_space_handle_t, bus_size_t, bus_size_t); 267 void (*bs_c_8)(bus_space_tag_t, bus_space_handle_t, bus_size_t, 268 bus_space_handle_t, bus_size_t, bus_size_t); 269 }; 270 271 272 /* 273 * Utility macros; INTERNAL USE ONLY. 274 */ 275 #define __bs_c(a,b) __CONCAT(a,b) 276 #define __bs_opname(op,s) __bs_c(__bs_c(__bs_c(bs_,op),_),s) 277 #define __bs_popname(pfx,op,s) __bs_c(pfx,__bs_c(_,__bs_opname(op,s))) 278 #define __bs_ops(t) (((bus_space_tag_t)(t))->bs_ops) 279 280 #define __bs_rs(sz, t, h, o) \ 281 (*__bs_ops(t).__bs_opname(r,sz))(t, h, o) 282 #define __bs_ws(sz, t, h, o, v) \ 283 (*__bs_ops(t).__bs_opname(w,sz))(t, h, o, v) 284 #ifdef BUS_SPACE_HAS_REAL_STREAM_METHODS 285 #define __bs_rss(sz, t, h, o) \ 286 (*__bs_ops(t).__bs_opname(rs,sz))(t, h, o) 287 #define __bs_wss(sz, t, h, o, v) \ 288 (*__bs_ops(t).__bs_opname(ws,sz))(t, h, o, v) 289 #endif /* BUS_SPACE_HAS_REAL_STREAM_METHODS */ 290 #define __bs_nonsingle(type, sz, t, h, o, a, c) \ 291 (*__bs_ops(t).__bs_opname(type,sz))(t, h, o, a, c) 292 #define __bs_set(type, sz, t, h, o, v, c) \ 293 (*__bs_ops(t).__bs_opname(type,sz))(t, h, o, v, c) 294 #define __bs_copy(sz, t, h1, o1, h2, o2, cnt) \ 295 (*__bs_ops(t).__bs_opname(c,sz))(t, h1, o1, h2, o2, cnt) 296 297 298 /* 299 * Mapping and unmapping operations. 300 */ 301 #define bus_space_map(t, a, s, c, hp) \ 302 (*__bs_ops(t).bs_map)(t, (a), (s), (c), (hp)) 303 #define bus_space_unmap(t, h, s) \ 304 (*__bs_ops(t).bs_unmap)(t, (h), (s)) 305 #define bus_space_subregion(t, h, o, s, hp) \ 306 (*__bs_ops(t).bs_subregion)(t, (h), (o), (s), (hp)) 307 308 309 /* 310 * Allocation and deallocation operations. 311 */ 312 #define bus_space_alloc(t, rs, re, s, a, b, c, ap, hp) \ 313 (*__bs_ops(t).bs_alloc)(t, (rs), (re), (s), (a), (b), (c), (ap), (hp)) 314 #define bus_space_free(t, h, s) \ 315 (*__bs_ops(t).bs_free)(t, (h), (s)) 316 317 318 /* 319 * Get kernel virtual address for ranges mapped BUS_SPACE_MAP_LINEAR. 320 */ 321 #define bus_space_vaddr(t, h) \ 322 (*__bs_ops(t).bs_vaddr)(t, (h)) 323 324 325 /* 326 * MMap bus space for a user application. 327 */ 328 #define bus_space_mmap(t, a, o, p, f) \ 329 (*__bs_ops(t).bs_mmap)(t, (a), (o), (p), (f)) 330 331 332 /* 333 * Bus barrier operations. 334 */ 335 #define bus_space_barrier(t, h, o, l, f) \ 336 (*__bs_ops(t).bs_barrier)(t, (h), (o), (l), (f)) 337 338 339 /* 340 * Bus probe operations. 341 */ 342 #define bus_space_peek(t, h, o, s, p) \ 343 (*__bs_ops(t).bs_peek)(t, (h), (o), (s), (p)) 344 #define bus_space_poke(t, h, o, s, v) \ 345 (*__bs_ops(t).bs_poke)(t, (h), (o), (s), (v)) 346 347 348 /* 349 * Bus read (single) operations. 350 */ 351 #define bus_space_read_1(t, h, o) __bs_rs(1,(t),(h),(o)) 352 #define bus_space_read_2(t, h, o) __bs_rs(2,(t),(h),(o)) 353 #define bus_space_read_4(t, h, o) __bs_rs(4,(t),(h),(o)) 354 #define bus_space_read_8(t, h, o) __bs_rs(8,(t),(h),(o)) 355 356 357 /* 358 * Bus read multiple operations. 359 */ 360 #define bus_space_read_multi_1(t, h, o, a, c) \ 361 __bs_nonsingle(rm,1,(t),(h),(o),(a),(c)) 362 #define bus_space_read_multi_2(t, h, o, a, c) \ 363 __bs_nonsingle(rm,2,(t),(h),(o),(a),(c)) 364 #define bus_space_read_multi_4(t, h, o, a, c) \ 365 __bs_nonsingle(rm,4,(t),(h),(o),(a),(c)) 366 #define bus_space_read_multi_8(t, h, o, a, c) \ 367 __bs_nonsingle(rm,8,(t),(h),(o),(a),(c)) 368 369 370 /* 371 * Bus read region operations. 372 */ 373 #define bus_space_read_region_1(t, h, o, a, c) \ 374 __bs_nonsingle(rr,1,(t),(h),(o),(a),(c)) 375 #define bus_space_read_region_2(t, h, o, a, c) \ 376 __bs_nonsingle(rr,2,(t),(h),(o),(a),(c)) 377 #define bus_space_read_region_4(t, h, o, a, c) \ 378 __bs_nonsingle(rr,4,(t),(h),(o),(a),(c)) 379 #define bus_space_read_region_8(t, h, o, a, c) \ 380 __bs_nonsingle(rr,8,(t),(h),(o),(a),(c)) 381 382 383 /* 384 * Bus write (single) operations. 385 */ 386 #define bus_space_write_1(t, h, o, v) __bs_ws(1,(t),(h),(o),(v)) 387 #define bus_space_write_2(t, h, o, v) __bs_ws(2,(t),(h),(o),(v)) 388 #define bus_space_write_4(t, h, o, v) __bs_ws(4,(t),(h),(o),(v)) 389 #define bus_space_write_8(t, h, o, v) __bs_ws(8,(t),(h),(o),(v)) 390 391 392 /* 393 * Bus write multiple operations. 394 */ 395 #define bus_space_write_multi_1(t, h, o, a, c) \ 396 __bs_nonsingle(wm,1,(t),(h),(o),(a),(c)) 397 #define bus_space_write_multi_2(t, h, o, a, c) \ 398 __bs_nonsingle(wm,2,(t),(h),(o),(a),(c)) 399 #define bus_space_write_multi_4(t, h, o, a, c) \ 400 __bs_nonsingle(wm,4,(t),(h),(o),(a),(c)) 401 #define bus_space_write_multi_8(t, h, o, a, c) \ 402 __bs_nonsingle(wm,8,(t),(h),(o),(a),(c)) 403 404 405 /* 406 * Bus write region operations. 407 */ 408 #define bus_space_write_region_1(t, h, o, a, c) \ 409 __bs_nonsingle(wr,1,(t),(h),(o),(a),(c)) 410 #define bus_space_write_region_2(t, h, o, a, c) \ 411 __bs_nonsingle(wr,2,(t),(h),(o),(a),(c)) 412 #define bus_space_write_region_4(t, h, o, a, c) \ 413 __bs_nonsingle(wr,4,(t),(h),(o),(a),(c)) 414 #define bus_space_write_region_8(t, h, o, a, c) \ 415 __bs_nonsingle(wr,8,(t),(h),(o),(a),(c)) 416 417 418 #ifdef BUS_SPACE_HAS_REAL_STREAM_METHODS 419 /* 420 * Bus read (single) stream operations. 421 */ 422 #define bus_space_read_stream_1(t, h, o) __bs_rss(1,(t),(h),(o)) 423 #define bus_space_read_stream_2(t, h, o) __bs_rss(2,(t),(h),(o)) 424 #define bus_space_read_stream_4(t, h, o) __bs_rss(4,(t),(h),(o)) 425 #define bus_space_read_stream_8(t, h, o) __bs_rss(8,(t),(h),(o)) 426 427 428 /* 429 * Bus read multiple operations. 430 */ 431 #define bus_space_read_multi_stream_1(t, h, o, a, c) \ 432 __bs_nonsingle(rms,1,(t),(h),(o),(a),(c)) 433 #define bus_space_read_multi_stream_2(t, h, o, a, c) \ 434 __bs_nonsingle(rms,2,(t),(h),(o),(a),(c)) 435 #define bus_space_read_multi_stream_4(t, h, o, a, c) \ 436 __bs_nonsingle(rms,4,(t),(h),(o),(a),(c)) 437 #define bus_space_read_multi_stream_8(t, h, o, a, c) \ 438 __bs_nonsingle(rms,8,(t),(h),(o),(a),(c)) 439 440 441 /* 442 * Bus read region operations. 443 */ 444 #define bus_space_read_region_stream_1(t, h, o, a, c) \ 445 __bs_nonsingle(rrs,1,(t),(h),(o),(a),(c)) 446 #define bus_space_read_region_stream_2(t, h, o, a, c) \ 447 __bs_nonsingle(rrs,2,(t),(h),(o),(a),(c)) 448 #define bus_space_read_region_stream_4(t, h, o, a, c) \ 449 __bs_nonsingle(rrs,4,(t),(h),(o),(a),(c)) 450 #define bus_space_read_region_stream_8(t, h, o, a, c) \ 451 __bs_nonsingle(rrs,8,(t),(h),(o),(a),(c)) 452 453 454 /* 455 * Bus write (single) operations. 456 */ 457 #define bus_space_write_stream_1(t, h, o, v) __bs_wss(1,(t),(h),(o),(v)) 458 #define bus_space_write_stream_2(t, h, o, v) __bs_wss(2,(t),(h),(o),(v)) 459 #define bus_space_write_stream_4(t, h, o, v) __bs_wss(4,(t),(h),(o),(v)) 460 #define bus_space_write_stream_8(t, h, o, v) __bs_wss(8,(t),(h),(o),(v)) 461 462 463 /* 464 * Bus write multiple operations. 465 */ 466 #define bus_space_write_multi_stream_1(t, h, o, a, c) \ 467 __bs_nonsingle(wms,1,(t),(h),(o),(a),(c)) 468 #define bus_space_write_multi_stream_2(t, h, o, a, c) \ 469 __bs_nonsingle(wms,2,(t),(h),(o),(a),(c)) 470 #define bus_space_write_multi_stream_4(t, h, o, a, c) \ 471 __bs_nonsingle(wms,4,(t),(h),(o),(a),(c)) 472 #define bus_space_write_multi_stream_8(t, h, o, a, c) \ 473 __bs_nonsingle(wms,8,(t),(h),(o),(a),(c)) 474 475 476 /* 477 * Bus write region operations. 478 */ 479 #define bus_space_write_region_stream_1(t, h, o, a, c) \ 480 __bs_nonsingle(wrs,1,(t),(h),(o),(a),(c)) 481 #define bus_space_write_region_stream_2(t, h, o, a, c) \ 482 __bs_nonsingle(wrs,2,(t),(h),(o),(a),(c)) 483 #define bus_space_write_region_stream_4(t, h, o, a, c) \ 484 __bs_nonsingle(wrs,4,(t),(h),(o),(a),(c)) 485 #define bus_space_write_region_stream_8(t, h, o, a, c) \ 486 __bs_nonsingle(wrs,8,(t),(h),(o),(a),(c)) 487 #else 488 #ifdef __BUS_SPACE_HAS_STREAM_METHODS 489 #define bus_space_read_stream_1 bus_space_read_1 490 #define bus_space_read_stream_2 bus_space_read_2 491 #define bus_space_read_stream_4 bus_space_read_4 492 #define bus_space_read_stream_8 bus_space_read_8 493 #define bus_space_read_multi_stream_1 bus_space_read_multi_1 494 #define bus_space_read_multi_stream_2 bus_space_read_multi_2 495 #define bus_space_read_multi_stream_4 bus_space_read_multi_4 496 #define bus_space_read_multi_stream_8 bus_space_read_multi_8 497 #define bus_space_read_region_stream_1 bus_space_read_region_1 498 #define bus_space_read_region_stream_2 bus_space_read_region_2 499 #define bus_space_read_region_stream_4 bus_space_read_region_4 500 #define bus_space_read_region_stream_8 bus_space_read_region_8 501 #define bus_space_write_stream_1 bus_space_write_1 502 #define bus_space_write_stream_2 bus_space_write_2 503 #define bus_space_write_stream_4 bus_space_write_4 504 #define bus_space_write_stream_8 bus_space_write_8 505 #define bus_space_write_multi_stream_1 bus_space_write_multi_1 506 #define bus_space_write_multi_stream_2 bus_space_write_multi_2 507 #define bus_space_write_multi_stream_4 bus_space_write_multi_4 508 #define bus_space_write_multi_stream_8 bus_space_write_multi_8 509 #define bus_space_write_region_stream_1 bus_space_write_region_1 510 #define bus_space_write_region_stream_2 bus_space_write_region_2 511 #define bus_space_write_region_stream_4 bus_space_write_region_4 512 #define bus_space_write_region_stream_8 bus_space_write_region_8 513 #endif /* __BUS_SPACE_HAS_STREAM_METHODS */ 514 #endif /* BUS_SPACE_HAS_REAL_STREAM_METHODS */ 515 516 517 /* 518 * Set multiple operations. 519 */ 520 #define bus_space_set_multi_1(t, h, o, v, c) \ 521 __bs_set(sm,1,(t),(h),(o),(v),(c)) 522 #define bus_space_set_multi_2(t, h, o, v, c) \ 523 __bs_set(sm,2,(t),(h),(o),(v),(c)) 524 #define bus_space_set_multi_4(t, h, o, v, c) \ 525 __bs_set(sm,4,(t),(h),(o),(v),(c)) 526 #define bus_space_set_multi_8(t, h, o, v, c) \ 527 __bs_set(sm,8,(t),(h),(o),(v),(c)) 528 529 530 /* 531 * Set region operations. 532 */ 533 #define bus_space_set_region_1(t, h, o, v, c) \ 534 __bs_set(sr,1,(t),(h),(o),(v),(c)) 535 #define bus_space_set_region_2(t, h, o, v, c) \ 536 __bs_set(sr,2,(t),(h),(o),(v),(c)) 537 #define bus_space_set_region_4(t, h, o, v, c) \ 538 __bs_set(sr,4,(t),(h),(o),(v),(c)) 539 #define bus_space_set_region_8(t, h, o, v, c) \ 540 __bs_set(sr,8,(t),(h),(o),(v),(c)) 541 542 543 /* 544 * Copy operations. 545 */ 546 #define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ 547 __bs_copy(1, t, h1, o1, h2, o2, c) 548 #define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ 549 __bs_copy(2, t, h1, o1, h2, o2, c) 550 #define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ 551 __bs_copy(4, t, h1, o1, h2, o2, c) 552 #define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ 553 __bs_copy(8, t, h1, o1, h2, o2, c) 554 555 556 /* 557 * Macros to provide prototypes for all the functions used in the 558 * bus_space structure 559 */ 560 #define bs_map_proto(f) \ 561 int __bs_c(f,_bs_map)(bus_space_tag_t t, bus_addr_t addr, \ 562 bus_size_t size, int cacheable, bus_space_handle_t *bshp) 563 564 #define bs_unmap_proto(f) \ 565 void __bs_c(f,_bs_unmap)(bus_space_tag_t t, bus_space_handle_t bsh, \ 566 bus_size_t size) 567 568 #define bs_subregion_proto(f) \ 569 int __bs_c(f,_bs_subregion)(bus_space_tag_t t, \ 570 bus_space_handle_t bsh, bus_size_t offset, \ 571 bus_size_t size, bus_space_handle_t *nbshp) 572 573 #define bs_alloc_proto(f) \ 574 int __bs_c(f,_bs_alloc)(bus_space_tag_t t, bus_addr_t rstart, \ 575 bus_addr_t rend, bus_size_t size, bus_size_t align, \ 576 bus_size_t boundary, int cacheable, bus_addr_t *addrp, \ 577 bus_space_handle_t *bshp) 578 579 #define bs_free_proto(f) \ 580 void __bs_c(f,_bs_free)(bus_space_tag_t t, bus_space_handle_t bsh, \ 581 bus_size_t size) 582 583 #define bs_vaddr_proto(f) \ 584 void * __bs_c(f,_bs_vaddr)(bus_space_tag_t t, bus_space_handle_t bsh) 585 586 #define bs_mmap_proto(f) \ 587 paddr_t __bs_c(f,_bs_mmap)(bus_space_tag_t t, bus_addr_t addr, \ 588 off_t offset, int prot, int flags) 589 590 #define bs_barrier_proto(f) \ 591 void __bs_c(f,_bs_barrier)(bus_space_tag_t t, bus_space_handle_t bsh,\ 592 bus_size_t offset, bus_size_t len, int flags) 593 594 #define bs_peek_proto(f) \ 595 int __bs_c(f,_bs_peek)(bus_space_tag_t t, bus_space_handle_t bsh, \ 596 bus_size_t offset, size_t len, void *ptr) 597 #define bs_poke_proto(f) \ 598 int __bs_c(f,_bs_poke)(bus_space_tag_t t, bus_space_handle_t bsh, \ 599 bus_size_t offset, size_t len, u_int32_t val) 600 601 #define bs_r_1_proto(f) \ 602 u_int8_t __bs_c(f,_bs_r_1)(bus_space_tag_t t, \ 603 bus_space_handle_t bsh, bus_size_t offset) 604 #define bs_r_2_proto(f) \ 605 u_int16_t __bs_c(f,_bs_r_2)(bus_space_tag_t t, \ 606 bus_space_handle_t bsh, bus_size_t offset) 607 #define bs_r_4_proto(f) \ 608 u_int32_t __bs_c(f,_bs_r_4)(bus_space_tag_t t, \ 609 bus_space_handle_t bsh, bus_size_t offset) 610 #define bs_r_8_proto(f) \ 611 u_int64_t __bs_c(f,_bs_r_8)(bus_space_tag_t t, \ 612 bus_space_handle_t bsh, bus_size_t offset) 613 614 #define bs_rm_1_proto(f) \ 615 void __bs_c(f,_bs_rm_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 616 bus_size_t offset, u_int8_t *addr, bus_size_t count) 617 #define bs_rm_2_proto(f) \ 618 void __bs_c(f,_bs_rm_2)(bus_space_tag_t t, bus_space_handle_t bsh, \ 619 bus_size_t offset, u_int16_t *addr, bus_size_t count) 620 #define bs_rm_4_proto(f) \ 621 void __bs_c(f,_bs_rm_4)(bus_space_tag_t t, bus_space_handle_t bsh, \ 622 bus_size_t offset, u_int32_t *addr, bus_size_t count) 623 #define bs_rm_8_proto(f) \ 624 void __bs_c(f,_bs_rm_8)(bus_space_tag_t t, bus_space_handle_t bsh, \ 625 bus_size_t offset, u_int64_t *addr, bus_size_t count) 626 627 #define bs_rr_1_proto(f) \ 628 void __bs_c(f,_bs_rr_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 629 bus_size_t offset, u_int8_t *addr, bus_size_t count) 630 #define bs_rr_2_proto(f) \ 631 void __bs_c(f,_bs_rr_2)(bus_space_tag_t t, bus_space_handle_t bsh, \ 632 bus_size_t offset, u_int16_t *addr, bus_size_t count) 633 #define bs_rr_4_proto(f) \ 634 void __bs_c(f,_bs_rr_4)(bus_space_tag_t t, bus_space_handle_t bsh, \ 635 bus_size_t offset, u_int32_t *addr, bus_size_t count) 636 #define bs_rr_8_proto(f) \ 637 void __bs_c(f,_bs_rr_8)(bus_space_tag_t t, bus_space_handle_t bsh, \ 638 bus_size_t offset, u_int64_t *addr, bus_size_t count) 639 640 #define bs_w_1_proto(f) \ 641 void __bs_c(f,_bs_w_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 642 bus_size_t offset, u_int8_t value) 643 #define bs_w_2_proto(f) \ 644 void __bs_c(f,_bs_w_2)(bus_space_tag_t t, bus_space_handle_t bsh, \ 645 bus_size_t offset, u_int16_t value) 646 #define bs_w_4_proto(f) \ 647 void __bs_c(f,_bs_w_4)(bus_space_tag_t t, bus_space_handle_t bsh, \ 648 bus_size_t offset, u_int32_t value) 649 #define bs_w_8_proto(f) \ 650 void __bs_c(f,_bs_w_8)(bus_space_tag_t t, bus_space_handle_t bsh, \ 651 bus_size_t offset, u_int64_t value) 652 653 #define bs_wm_1_proto(f) \ 654 void __bs_c(f,_bs_wm_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 655 bus_size_t offset, const u_int8_t *addr, bus_size_t count) 656 #define bs_wm_2_proto(f) \ 657 void __bs_c(f,_bs_wm_2)(bus_space_tag_t t, bus_space_handle_t bsh, \ 658 bus_size_t offset, const u_int16_t *addr, bus_size_t count) 659 #define bs_wm_4_proto(f) \ 660 void __bs_c(f,_bs_wm_4)(bus_space_tag_t t, bus_space_handle_t bsh, \ 661 bus_size_t offset, const u_int32_t *addr, bus_size_t count) 662 #define bs_wm_8_proto(f) \ 663 void __bs_c(f,_bs_wm_8)(bus_space_tag_t t, bus_space_handle_t bsh, \ 664 bus_size_t offset, const u_int64_t *addr, bus_size_t count) 665 666 #define bs_wr_1_proto(f) \ 667 void __bs_c(f,_bs_wr_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 668 bus_size_t offset, const u_int8_t *addr, bus_size_t count) 669 #define bs_wr_2_proto(f) \ 670 void __bs_c(f,_bs_wr_2)(bus_space_tag_t t, bus_space_handle_t bsh, \ 671 bus_size_t offset, const u_int16_t *addr, bus_size_t count) 672 #define bs_wr_4_proto(f) \ 673 void __bs_c(f,_bs_wr_4)(bus_space_tag_t t, bus_space_handle_t bsh, \ 674 bus_size_t offset, const u_int32_t *addr, bus_size_t count) 675 #define bs_wr_8_proto(f) \ 676 void __bs_c(f,_bs_wr_8)(bus_space_tag_t t, bus_space_handle_t bsh, \ 677 bus_size_t offset, const u_int64_t *addr, bus_size_t count) 678 679 #ifdef BUS_SPACE_HAS_REAL_STREAM_METHODS 680 #define bs_rs_1_proto(f) \ 681 u_int8_t __bs_c(f,_bs_rs_1)(bus_space_tag_t t, \ 682 bus_space_handle_t bsh, bus_size_t offset) 683 #define bs_rs_2_proto(f) \ 684 u_int16_t __bs_c(f,_bs_rs_2)(bus_space_tag_t t, \ 685 bus_space_handle_t bsh, bus_size_t offset) 686 #define bs_rs_4_proto(f) \ 687 u_int32_t __bs_c(f,_bs_rs_4)(bus_space_tag_t t, \ 688 bus_space_handle_t bsh, bus_size_t offset) 689 #define bs_rs_8_proto(f) \ 690 u_int64_t __bs_c(f,_bs_rs_8)(bus_space_tag_t t, \ 691 bus_space_handle_t bsh, bus_size_t offset) 692 693 #define bs_rms_1_proto(f) \ 694 void __bs_c(f,_bs_rms_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 695 bus_size_t offset, u_int8_t *addr, bus_size_t count) 696 #define bs_rms_2_proto(f) \ 697 void __bs_c(f,_bs_rms_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 698 bus_size_t offset, u_int16_t *addr, bus_size_t count) 699 #define bs_rms_4_proto(f) \ 700 void __bs_c(f,_bs_rms_4)(bus_space_tag_t t, bus_space_handle_t bsh, \ 701 bus_size_t offset, u_int32_t *addr, bus_size_t count) 702 #define bs_rms_8_proto(f) \ 703 void __bs_c(f,_bs_rms_8)(bus_space_tag_t t, bus_space_handle_t bsh, \ 704 bus_size_t offset, u_int64_t *addr, bus_size_t count) 705 706 #define bs_rrs_1_proto(f) \ 707 void __bs_c(f,_bs_rrs_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 708 bus_size_t offset, u_int8_t *addr, bus_size_t count) 709 #define bs_rrs_2_proto(f) \ 710 void __bs_c(f,_bs_rrs_2)(bus_space_tag_t t, bus_space_handle_t bsh, \ 711 bus_size_t offset, u_int16_t *addr, bus_size_t count) 712 #define bs_rrs_4_proto(f) \ 713 void __bs_c(f,_bs_rrs_4)(bus_space_tag_t t, bus_space_handle_t bsh, \ 714 bus_size_t offset, u_int32_t *addr, bus_size_t count) 715 #define bs_rrs_8_proto(f) \ 716 void __bs_c(f,_bs_rrs_8)(bus_space_tag_t t, bus_space_handle_t bsh, \ 717 bus_size_t offset, u_int64_t *addr, bus_size_t count) 718 719 #define bs_ws_1_proto(f) \ 720 void __bs_c(f,_bs_ws_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 721 bus_size_t offset, u_int8_t value) 722 #define bs_ws_2_proto(f) \ 723 void __bs_c(f,_bs_ws_2)(bus_space_tag_t t, bus_space_handle_t bsh, \ 724 bus_size_t offset, u_int16_t value) 725 #define bs_ws_4_proto(f) \ 726 void __bs_c(f,_bs_ws_4)(bus_space_tag_t t, bus_space_handle_t bsh, \ 727 bus_size_t offset, u_int32_t value) 728 #define bs_ws_8_proto(f) \ 729 void __bs_c(f,_bs_ws_8)(bus_space_tag_t t, bus_space_handle_t bsh, \ 730 bus_size_t offset, u_int64_t value) 731 732 #define bs_wms_1_proto(f) \ 733 void __bs_c(f,_bs_wms_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 734 bus_size_t offset, const u_int8_t *addr, bus_size_t count) 735 #define bs_wms_2_proto(f) \ 736 void __bs_c(f,_bs_wms_2)(bus_space_tag_t t, bus_space_handle_t bsh, \ 737 bus_size_t offset, const u_int16_t *addr, bus_size_t count) 738 #define bs_wms_4_proto(f) \ 739 void __bs_c(f,_bs_wms_4)(bus_space_tag_t t, bus_space_handle_t bsh, \ 740 bus_size_t offset, const u_int32_t *addr, bus_size_t count) 741 #define bs_wms_8_proto(f) \ 742 void __bs_c(f,_bs_wms_8)(bus_space_tag_t t, bus_space_handle_t bsh, \ 743 bus_size_t offset, const u_int64_t *addr, bus_size_t count) 744 745 #define bs_wrs_1_proto(f) \ 746 void __bs_c(f,_bs_wrs_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 747 bus_size_t offset, const u_int8_t *addr, bus_size_t count) 748 #define bs_wrs_2_proto(f) \ 749 void __bs_c(f,_bs_wrs_2)(bus_space_tag_t t, bus_space_handle_t bsh, \ 750 bus_size_t offset, const u_int16_t *addr, bus_size_t count) 751 #define bs_wrs_4_proto(f) \ 752 void __bs_c(f,_bs_wrs_4)(bus_space_tag_t t, bus_space_handle_t bsh, \ 753 bus_size_t offset, const u_int32_t *addr, bus_size_t count) 754 #define bs_wrs_8_proto(f) \ 755 void __bs_c(f,_bs_wrs_8)(bus_space_tag_t t, bus_space_handle_t bsh, \ 756 bus_size_t offset, const u_int64_t *addr, bus_size_t count) 757 #else /* BUS_SPACE_HAS_REAL_STREAM_METHODS */ 758 #define bs_rs_1_proto(f) 759 #define bs_rs_2_proto(f) 760 #define bs_rs_4_proto(f) 761 #define bs_rs_8_proto(f) 762 #define bs_rms_1_proto(f) 763 #define bs_rms_2_proto(f) 764 #define bs_rms_4_proto(f) 765 #define bs_rms_8_proto(f) 766 #define bs_rrs_1_proto(f) 767 #define bs_rrs_2_proto(f) 768 #define bs_rrs_4_proto(f) 769 #define bs_rrs_8_proto(f) 770 #define bs_ws_1_proto(f) 771 #define bs_ws_2_proto(f) 772 #define bs_ws_4_proto(f) 773 #define bs_ws_8_proto(f) 774 #define bs_wms_1_proto(f) 775 #define bs_wms_2_proto(f) 776 #define bs_wms_4_proto(f) 777 #define bs_wms_8_proto(f) 778 #define bs_wrs_1_proto(f) 779 #define bs_wrs_2_proto(f) 780 #define bs_wrs_4_proto(f) 781 #define bs_wrs_8_proto(f) 782 #endif /* ! BUS_SPACE_HAS_REAL_STREAM_METHODS */ 783 784 #define bs_sm_1_proto(f) \ 785 void __bs_c(f,_bs_sm_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 786 bus_size_t offset, u_int8_t value, bus_size_t count) 787 #define bs_sm_2_proto(f) \ 788 void __bs_c(f,_bs_sm_2)(bus_space_tag_t t, bus_space_handle_t bsh, \ 789 bus_size_t offset, u_int16_t value, bus_size_t count) 790 #define bs_sm_4_proto(f) \ 791 void __bs_c(f,_bs_sm_4)(bus_space_tag_t t, bus_space_handle_t bsh, \ 792 bus_size_t offset, u_int32_t value, bus_size_t count) 793 #define bs_sm_8_proto(f) \ 794 void __bs_c(f,_bs_sm_8)(bus_space_tag_t t, bus_space_handle_t bsh, \ 795 bus_size_t offset, u_int64_t value, bus_size_t count) 796 797 #define bs_sr_1_proto(f) \ 798 void __bs_c(f,_bs_sr_1)(bus_space_tag_t t, bus_space_handle_t bsh, \ 799 bus_size_t offset, u_int8_t value, bus_size_t count) 800 #define bs_sr_2_proto(f) \ 801 void __bs_c(f,_bs_sr_2)(bus_space_tag_t t, bus_space_handle_t bsh, \ 802 bus_size_t offset, u_int16_t value, bus_size_t count) 803 #define bs_sr_4_proto(f) \ 804 void __bs_c(f,_bs_sr_4)(bus_space_tag_t t, bus_space_handle_t bsh, \ 805 bus_size_t offset, u_int32_t value, bus_size_t count) 806 #define bs_sr_8_proto(f) \ 807 void __bs_c(f,_bs_sr_8)(bus_space_tag_t t, bus_space_handle_t bsh, \ 808 bus_size_t offset, u_int64_t value, bus_size_t count) 809 810 #define bs_c_1_proto(f) \ 811 void __bs_c(f,_bs_c_1)(bus_space_tag_t t, bus_space_handle_t bsh1, \ 812 bus_size_t offset1, bus_space_handle_t bsh2, \ 813 bus_size_t offset2, bus_size_t count) 814 #define bs_c_2_proto(f) \ 815 void __bs_c(f,_bs_c_2)(bus_space_tag_t t, bus_space_handle_t bsh1, \ 816 bus_size_t offset1, bus_space_handle_t bsh2, \ 817 bus_size_t offset2, bus_size_t count) 818 #define bs_c_4_proto(f) \ 819 void __bs_c(f,_bs_c_4)(bus_space_tag_t t, bus_space_handle_t bsh1, \ 820 bus_size_t offset1, bus_space_handle_t bsh2, \ 821 bus_size_t offset2, bus_size_t count) 822 #define bs_c_8_proto(f) \ 823 void __bs_c(f,_bs_c_8)(bus_space_tag_t t, bus_space_handle_t bsh1, \ 824 bus_size_t offset1, bus_space_handle_t bsh2, \ 825 bus_size_t offset2, bus_size_t count) 826 827 828 #define bus_space_protos(f) \ 829 bs_map_proto(f); \ 830 bs_unmap_proto(f); \ 831 bs_subregion_proto(f); \ 832 bs_alloc_proto(f); \ 833 bs_free_proto(f); \ 834 bs_vaddr_proto(f); \ 835 bs_mmap_proto(f); \ 836 bs_barrier_proto(f); \ 837 bs_peek_proto(f); \ 838 bs_poke_proto(f); \ 839 bs_r_1_proto(f); \ 840 bs_r_2_proto(f); \ 841 bs_r_4_proto(f); \ 842 bs_r_8_proto(f); \ 843 bs_rm_1_proto(f); \ 844 bs_rm_2_proto(f); \ 845 bs_rm_4_proto(f); \ 846 bs_rm_8_proto(f); \ 847 bs_rr_1_proto(f); \ 848 bs_rr_2_proto(f); \ 849 bs_rr_4_proto(f); \ 850 bs_rr_8_proto(f); \ 851 bs_w_1_proto(f); \ 852 bs_w_2_proto(f); \ 853 bs_w_4_proto(f); \ 854 bs_w_8_proto(f); \ 855 bs_wm_1_proto(f); \ 856 bs_wm_2_proto(f); \ 857 bs_wm_4_proto(f); \ 858 bs_wm_8_proto(f); \ 859 bs_wr_1_proto(f); \ 860 bs_wr_2_proto(f); \ 861 bs_wr_4_proto(f); \ 862 bs_wr_8_proto(f); \ 863 bs_rs_1_proto(f); \ 864 bs_rs_2_proto(f); \ 865 bs_rs_4_proto(f); \ 866 bs_rs_8_proto(f); \ 867 bs_rms_1_proto(f); \ 868 bs_rms_2_proto(f); \ 869 bs_rms_4_proto(f); \ 870 bs_rms_8_proto(f); \ 871 bs_rrs_1_proto(f); \ 872 bs_rrs_2_proto(f); \ 873 bs_rrs_4_proto(f); \ 874 bs_rrs_8_proto(f); \ 875 bs_ws_1_proto(f); \ 876 bs_ws_2_proto(f); \ 877 bs_ws_4_proto(f); \ 878 bs_ws_8_proto(f); \ 879 bs_wms_1_proto(f); \ 880 bs_wms_2_proto(f); \ 881 bs_wms_4_proto(f); \ 882 bs_wms_8_proto(f); \ 883 bs_wrs_1_proto(f); \ 884 bs_wrs_2_proto(f); \ 885 bs_wrs_4_proto(f); \ 886 bs_wrs_8_proto(f); \ 887 bs_sm_1_proto(f); \ 888 bs_sm_2_proto(f); \ 889 bs_sm_4_proto(f); \ 890 bs_sm_8_proto(f); \ 891 bs_sr_1_proto(f); \ 892 bs_sr_2_proto(f); \ 893 bs_sr_4_proto(f); \ 894 bs_sr_8_proto(f); \ 895 bs_c_1_proto(f); \ 896 bs_c_2_proto(f); \ 897 bs_c_4_proto(f); \ 898 bs_c_8_proto(f); 899 900 #endif /* ! BUS_SPACE_MD_CALLS */ 901 902 #ifndef BUS_SPACE_MD_TYPES 903 #ifdef BUS_SPACE_MD_CALLS 904 typedef struct bus_space *bus_space_tag_t; 905 #endif /* BUS_SPACE_MD_CALLS */ 906 907 /* 908 * bus_space_tag_t 909 * 910 * bus space tag structure 911 */ 912 struct bus_space_tag { 913 bus_space_tag_t bs_base; 914 struct bus_space_ops bs_ops; 915 }; 916 #endif /* ! BUS_SPACE_MD_TYPES */ 917 918 #ifndef BUS_DMA_MD_CALLS 919 920 /* 921 * Flags used in various bus DMA methods. 922 */ 923 #define BUS_DMA_WAITOK 0x000 /* safe to sleep (pseudo-flag) */ 924 #define BUS_DMA_NOWAIT 0x001 /* not safe to sleep */ 925 #define BUS_DMA_ALLOCNOW 0x002 /* perform resource allocation now */ 926 #define BUS_DMA_COHERENT 0x004 /* hint: map memory DMA coherent */ 927 #define BUS_DMA_STREAMING 0x008 /* hint: sequential, unidirectional */ 928 #define BUS_DMA_BUS1 0x010 /* placeholders for bus functions... */ 929 #define BUS_DMA_BUS2 0x020 930 #define BUS_DMA_BUS3 0x040 931 #define BUS_DMA_BUS4 0x080 932 #define BUS_DMA_READ 0x100 /* mapping is device -> memory only */ 933 #define BUS_DMA_WRITE 0x200 /* mapping is memory -> device only */ 934 935 /* 936 * Operations performed by bus_dmamap_sync(). 937 */ 938 #define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */ 939 #define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */ 940 #define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */ 941 #define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */ 942 943 /* Forwards needed by prototypes below. */ 944 struct mbuf; 945 struct uio; 946 947 #ifndef BUS_DMA_MD_TYPES 948 typedef struct bus_dma_tag *bus_dma_tag_t; 949 typedef struct bus_dma_segment bus_dma_segment_t; 950 typedef struct bus_dmamap *bus_dmamap_t; 951 #endif /* ! BUS_DMA_MD_TYPES */ 952 953 /* 954 * bus DMA operaion table 955 */ 956 struct bus_dma_ops { 957 /* 958 * DMA mapping methods. 959 */ 960 int (*bd_map_create)(bus_dma_tag_t, bus_size_t, int, 961 bus_size_t, bus_size_t, int, bus_dmamap_t *); 962 void (*bd_map_destroy)(bus_dma_tag_t, bus_dmamap_t); 963 int (*bd_map_load)(bus_dma_tag_t, bus_dmamap_t, void *, 964 bus_size_t, struct proc *, int); 965 int (*bd_map_load_mbuf)(bus_dma_tag_t, bus_dmamap_t, 966 struct mbuf *, int); 967 int (*bd_map_load_uio)(bus_dma_tag_t, bus_dmamap_t, 968 struct uio *, int); 969 int (*bd_map_load_raw)(bus_dma_tag_t, bus_dmamap_t, 970 bus_dma_segment_t *, int, bus_size_t, int); 971 void (*bd_map_unload)(bus_dma_tag_t, bus_dmamap_t); 972 void (*bd_map_sync)(bus_dma_tag_t, bus_dmamap_t, 973 bus_addr_t, bus_size_t, int); 974 975 /* 976 * DMA memory utility functions. 977 */ 978 int (*bd_mem_alloc)(bus_dma_tag_t, bus_size_t, bus_size_t, 979 bus_size_t, bus_dma_segment_t *, int, int *, int); 980 void (*bd_mem_free)(bus_dma_tag_t, 981 bus_dma_segment_t *, int); 982 int (*bd_mem_map)(bus_dma_tag_t, bus_dma_segment_t *, 983 int, size_t, caddr_t *, int); 984 void (*bd_mem_unmap)(bus_dma_tag_t, caddr_t, size_t); 985 paddr_t (*bd_mem_mmap)(bus_dma_tag_t, bus_dma_segment_t *, 986 int, off_t, int, int); 987 }; 988 989 990 /* 991 * bus DMA methods 992 */ 993 #define __bd_ops(t) (((bus_dma_tag_t)(t))->bd_ops) 994 #define bus_dmamap_create(t, s, n, m, b, f, p) \ 995 (*__bd_ops(t).bd_map_create)((t), (s), (n), (m), (b), (f), (p)) 996 #define bus_dmamap_destroy(t, p) \ 997 (*__bd_ops(t).bd_map_destroy)((t), (p)) 998 #define bus_dmamap_load(t, m, b, s, p, f) \ 999 (*__bd_ops(t).bd_map_load)((t), (m), (b), (s), (p), (f)) 1000 #define bus_dmamap_load_mbuf(t, m, b, f) \ 1001 (*__bd_ops(t).bd_map_load_mbuf)((t), (m), (b), (f)) 1002 #define bus_dmamap_load_uio(t, m, u, f) \ 1003 (*__bd_ops(t).bd_map_load_uio)((t), (m), (u), (f)) 1004 #define bus_dmamap_load_raw(t, m, sg, n, s, f) \ 1005 (*__bd_ops(t).bd_map_load_raw)((t), (m), (sg), (n), (s), (f)) 1006 #define bus_dmamap_unload(t, p) \ 1007 (*__bd_ops(t).bd_map_unload)((t), (p)) 1008 #define bus_dmamap_sync(t, p, o, l, ops) \ 1009 (void)(__bd_ops(t).bd_map_sync ? \ 1010 (*__bd_ops(t).bd_map_sync)((t), (p), (o), (l), (ops)) : (void)0) 1011 1012 #define bus_dmamem_alloc(t, s, a, b, sg, n, r, f) \ 1013 (*__bd_ops(t).bd_mem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f)) 1014 #define bus_dmamem_free(t, sg, n) \ 1015 (*__bd_ops(t).bd_mem_free)((t), (sg), (n)) 1016 #define bus_dmamem_map(t, sg, n, s, k, f) \ 1017 (*__bd_ops(t).bd_mem_map)((t), (sg), (n), (s), (k), (f)) 1018 #define bus_dmamem_unmap(t, k, s) \ 1019 (*__bd_ops(t).bd_mem_unmap)((t), (k), (s)) 1020 #define bus_dmamem_mmap(t, sg, n, o, p, f) \ 1021 (*__bd_ops(t).bd_mem_mmap)((t), (sg), (n), (o), (p), (f)) 1022 1023 1024 /* 1025 * Macros to provide prototypes for all the functions used in the 1026 * bus_dma structure 1027 */ 1028 #define bus_dma_protos(f) \ 1029 int __bs_c(f,_bd_map_create)(bus_dma_tag_t, bus_size_t, int, \ 1030 bus_size_t, bus_size_t, int, bus_dmamap_t *); \ 1031 void __bs_c(f,_bd_map_destroy)(bus_dma_tag_t, bus_dmamap_t); \ 1032 int __bs_c(f,_bd_map_load)(bus_dma_tag_t, bus_dmamap_t, void *, \ 1033 bus_size_t, struct proc *, int); \ 1034 int __bs_c(f,_bd_map_load_mbuf)(bus_dma_tag_t, bus_dmamap_t, \ 1035 struct mbuf *, int); \ 1036 int __bs_c(f,_bd_map_load_uio)(bus_dma_tag_t, bus_dmamap_t, \ 1037 struct uio *, int); \ 1038 int __bs_c(f,_bd_map_load_raw)(bus_dma_tag_t, bus_dmamap_t, \ 1039 bus_dma_segment_t *, int, bus_size_t, int); \ 1040 void __bs_c(f,_bd_map_unload)(bus_dma_tag_t, bus_dmamap_t); \ 1041 void __bs_c(f,_bd_map_sync)(bus_dma_tag_t, bus_dmamap_t, \ 1042 bus_addr_t, bus_size_t, int); \ 1043 int __bs_c(f,_bd_mem_alloc)(bus_dma_tag_t, bus_size_t, bus_size_t, \ 1044 bus_size_t, bus_dma_segment_t *, int, int *, int); \ 1045 void __bs_c(f,_bd_mem_free)(bus_dma_tag_t, bus_dma_segment_t *, int);\ 1046 int __bs_c(f,_bd_mem_map)(bus_dma_tag_t, bus_dma_segment_t *, \ 1047 int, size_t, caddr_t *, int); \ 1048 void __bs_c(f,_bd_mem_unmap)(bus_dma_tag_t, caddr_t, size_t); \ 1049 paddr_t __bs_c(f,_bd_mem_mmap)(bus_dma_tag_t, bus_dma_segment_t *, \ 1050 int, off_t, int, int); 1051 1052 #endif /* ! BUS_DMA_MD_CALLS */ 1053 1054 #ifndef BUS_DMA_MD_TYPES 1055 #ifdef BUS_DMA_MD_CALLS 1056 typedef struct bus_dma_tag *bus_dma_tag_t; 1057 typedef struct bus_dma_segment bus_dma_segment_t; 1058 typedef struct bus_dmamap *bus_dmamap_t; 1059 #endif /* ! BUS_DMA_MD_CALLS */ 1060 1061 /* 1062 * bus_dma_tag 1063 * 1064 * Describes a implementation of DMA for a given bus. 1065 */ 1066 struct bus_dma_tag { 1067 bus_dma_tag_t bd_base; 1068 struct bus_dma_ops bd_ops; 1069 }; 1070 1071 /* 1072 * bus_dma_segment 1073 * 1074 * Describes a single contiguous DMA transaction. 1075 */ 1076 struct bus_dma_segment { 1077 bus_addr_t ds_addr; /* DMA address */ 1078 bus_size_t ds_len; /* length of transfer */ 1079 }; 1080 1081 /* 1082 * bus_dmamap 1083 * 1084 * Describes a DMA mapping. 1085 */ 1086 struct bus_dmamap { 1087 bus_size_t dm_mapsize; /* size of the mapping */ 1088 int dm_nsegs; /* # valid segments in mapping */ 1089 bus_dma_segment_t *dm_segs; /* segments; variable length */ 1090 }; 1091 1092 #endif /* ! BUS_DMA_MD_TYPES */ 1093 1094 #include <machine/bus_machdep.h> 1095 1096 #endif /* _SYS_BUS_H_ */ 1097