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