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