1 /* $NetBSD: bus_proto.h,v 1.4 2010/04/28 19:51:16 dyoung Exp $ */ 2 3 /*- 4 * Copyright (c) 1996, 1997, 1998, 2001, 2007 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, and by Andrew Doran. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /* 34 * Copyright (c) 1996 Charles M. Hannum. All rights reserved. 35 * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. 36 * 37 * Redistribution and use in source and binary forms, with or without 38 * modification, are permitted provided that the following conditions 39 * are met: 40 * 1. Redistributions of source code must retain the above copyright 41 * notice, this list of conditions and the following disclaimer. 42 * 2. Redistributions in binary form must reproduce the above copyright 43 * notice, this list of conditions and the following disclaimer in the 44 * documentation and/or other materials provided with the distribution. 45 * 3. All advertising materials mentioning features or use of this software 46 * must display the following acknowledgement: 47 * This product includes software developed by Christopher G. Demetriou 48 * for the NetBSD Project. 49 * 4. The name of the author may not be used to endorse or promote products 50 * derived from this software without specific prior written permission 51 * 52 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 53 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 54 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 55 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 56 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 57 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 58 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 59 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 60 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 61 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 62 */ 63 64 #ifndef _SYS_BUS_PROTO_H_ 65 #define _SYS_BUS_PROTO_H_ 66 67 /* 68 * Forwards needed by prototypes below. 69 */ 70 struct mbuf; 71 struct uio; 72 73 /* 74 * bus_space(9) 75 */ 76 77 /* Map types. */ 78 #define BUS_SPACE_MAP_CACHEABLE 0x01 79 #define BUS_SPACE_MAP_LINEAR 0x02 80 #define BUS_SPACE_MAP_PREFETCHABLE 0x04 81 82 /* Bus read/write barrier methods. */ 83 #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ 84 #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ 85 86 int bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t, int, 87 bus_space_handle_t *); 88 89 void bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t); 90 91 int bus_space_subregion(bus_space_tag_t, bus_space_handle_t, 92 bus_size_t, bus_size_t, bus_space_handle_t *); 93 94 int bus_space_alloc(bus_space_tag_t, bus_addr_t, bus_addr_t, 95 bus_size_t, bus_size_t, bus_size_t, 96 int, bus_addr_t *, bus_space_handle_t *); 97 98 void bus_space_free(bus_space_tag_t, bus_space_handle_t, bus_size_t); 99 100 paddr_t bus_space_mmap(bus_space_tag_t, bus_addr_t, off_t, int, int); 101 102 void *bus_space_vaddr(bus_space_tag_t, bus_space_handle_t); 103 104 void bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh, 105 bus_size_t offset, bus_size_t len, int flags); 106 107 /* 108 * bus_space(9) accessors 109 */ 110 111 uint8_t bus_space_read_1(bus_space_tag_t, bus_space_handle_t, 112 bus_size_t); 113 uint8_t bus_space_read_stream_1(bus_space_tag_t, bus_space_handle_t, 114 bus_size_t); 115 116 uint16_t bus_space_read_2(bus_space_tag_t, bus_space_handle_t, 117 bus_size_t); 118 uint16_t bus_space_read_stream_2(bus_space_tag_t, bus_space_handle_t, 119 bus_size_t); 120 121 uint32_t bus_space_read_4(bus_space_tag_t, bus_space_handle_t, 122 bus_size_t); 123 uint32_t bus_space_read_stream_4(bus_space_tag_t, bus_space_handle_t, 124 bus_size_t); 125 126 uint64_t bus_space_read_8(bus_space_tag_t, bus_space_handle_t, 127 bus_size_t); 128 uint64_t bus_space_read_stream_8(bus_space_tag_t, bus_space_handle_t, 129 bus_size_t); 130 131 void bus_space_read_multi_1(bus_space_tag_t, bus_space_handle_t, 132 bus_size_t, uint8_t *, bus_size_t); 133 void bus_space_read_multi_stream_1(bus_space_tag_t, bus_space_handle_t, 134 bus_size_t, uint8_t *, bus_size_t); 135 void bus_space_read_region_1(bus_space_tag_t, bus_space_handle_t, 136 bus_size_t, uint8_t *, bus_size_t); 137 void bus_space_read_region_stream_1(bus_space_tag_t, bus_space_handle_t, 138 bus_size_t, uint8_t *, bus_size_t); 139 140 void bus_space_read_multi_2(bus_space_tag_t, bus_space_handle_t, 141 bus_size_t, uint16_t *, bus_size_t); 142 void bus_space_read_multi_stream_2(bus_space_tag_t, bus_space_handle_t, 143 bus_size_t, uint16_t *, bus_size_t); 144 void bus_space_read_region_2(bus_space_tag_t, bus_space_handle_t, 145 bus_size_t, uint16_t *, bus_size_t); 146 void bus_space_read_region_stream_2(bus_space_tag_t, bus_space_handle_t, 147 bus_size_t, uint16_t *, bus_size_t); 148 149 void bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t, 150 bus_size_t, uint32_t *, bus_size_t); 151 void bus_space_read_multi_stream_4(bus_space_tag_t, bus_space_handle_t, 152 bus_size_t, uint32_t *, bus_size_t); 153 void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t, 154 bus_size_t, uint32_t *, bus_size_t); 155 void bus_space_read_region_stream_4(bus_space_tag_t, bus_space_handle_t, 156 bus_size_t, uint32_t *, bus_size_t); 157 158 void bus_space_read_multi_8(bus_space_tag_t, bus_space_handle_t, 159 bus_size_t, uint32_t *, bus_size_t); 160 void bus_space_read_multi_stream_8(bus_space_tag_t, bus_space_handle_t, 161 bus_size_t, uint32_t *, bus_size_t); 162 void bus_space_read_region_8(bus_space_tag_t, bus_space_handle_t, 163 bus_size_t, uint64_t *, bus_size_t); 164 void bus_space_read_region_stream_8(bus_space_tag_t, bus_space_handle_t, 165 bus_size_t, uint64_t *, bus_size_t); 166 167 void bus_space_write_1(bus_space_tag_t, bus_space_handle_t, 168 bus_size_t, uint8_t); 169 void bus_space_write_stream_1(bus_space_tag_t, bus_space_handle_t, 170 bus_size_t, uint8_t); 171 172 void bus_space_write_2(bus_space_tag_t, bus_space_handle_t, 173 bus_size_t, uint16_t); 174 void bus_space_write_stream_2(bus_space_tag_t, bus_space_handle_t, 175 bus_size_t, uint16_t); 176 177 void bus_space_write_4(bus_space_tag_t, bus_space_handle_t, 178 bus_size_t, uint32_t); 179 void bus_space_write_stream_4(bus_space_tag_t, bus_space_handle_t, 180 bus_size_t, uint32_t); 181 182 void bus_space_write_8(bus_space_tag_t, bus_space_handle_t, 183 bus_size_t, uint64_t); 184 void bus_space_write_stream_8(bus_space_tag_t, bus_space_handle_t, 185 bus_size_t, uint64_t); 186 187 void bus_space_write_multi_1(bus_space_tag_t, bus_space_handle_t, 188 bus_size_t, const uint8_t *, 189 bus_size_t); 190 void bus_space_write_multi_stream_1(bus_space_tag_t, bus_space_handle_t, 191 bus_size_t, const uint8_t *, 192 bus_size_t); 193 void bus_space_write_region_1(bus_space_tag_t, bus_space_handle_t, 194 bus_size_t, const uint8_t *, 195 bus_size_t); 196 void bus_space_write_region_stream_1(bus_space_tag_t, bus_space_handle_t, 197 bus_size_t, const uint8_t *, 198 bus_size_t); 199 200 void bus_space_write_multi_2(bus_space_tag_t, bus_space_handle_t, 201 bus_size_t, const uint16_t *, 202 bus_size_t); 203 void bus_space_write_multi_stream_2(bus_space_tag_t, bus_space_handle_t, 204 bus_size_t, const uint16_t *, 205 bus_size_t); 206 void bus_space_write_region_2(bus_space_tag_t, bus_space_handle_t, 207 bus_size_t, const uint16_t *, 208 bus_size_t); 209 void bus_space_write_region_stream_2(bus_space_tag_t, bus_space_handle_t, 210 bus_size_t, const uint16_t *, 211 bus_size_t); 212 213 void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t, 214 bus_size_t, const uint32_t *, 215 bus_size_t); 216 void bus_space_write_multi_stream_4(bus_space_tag_t, bus_space_handle_t, 217 bus_size_t, const uint32_t *, 218 bus_size_t); 219 void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t, 220 bus_size_t, const uint32_t *, 221 bus_size_t); 222 void bus_space_write_region_stream_4(bus_space_tag_t, bus_space_handle_t, 223 bus_size_t, const uint32_t *, 224 bus_size_t); 225 226 void bus_space_write_multi_8(bus_space_tag_t, bus_space_handle_t, 227 bus_size_t, const uint32_t *, 228 bus_size_t); 229 void bus_space_write_multi_stream_8(bus_space_tag_t, bus_space_handle_t, 230 bus_size_t, const uint32_t *, 231 bus_size_t); 232 void bus_space_write_region_8(bus_space_tag_t, bus_space_handle_t, 233 bus_size_t, const uint64_t *, 234 bus_size_t); 235 void bus_space_write_region_stream_8(bus_space_tag_t, bus_space_handle_t, 236 bus_size_t, const uint64_t *, 237 bus_size_t); 238 239 void bus_space_set_multi_1(bus_space_tag_t, bus_space_handle_t, 240 bus_size_t, u_int8_t, size_t); 241 void bus_space_set_multi_2(bus_space_tag_t, bus_space_handle_t, 242 bus_size_t, u_int16_t, size_t); 243 void bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t, 244 bus_size_t, u_int32_t, size_t); 245 void bus_space_set_multi_8(bus_space_tag_t, bus_space_handle_t, 246 bus_size_t, u_int64_t, size_t); 247 248 249 void bus_space_set_region_1(bus_space_tag_t, bus_space_handle_t, 250 bus_size_t, u_int8_t, size_t); 251 void bus_space_set_region_2(bus_space_tag_t, bus_space_handle_t, 252 bus_size_t, u_int16_t, size_t); 253 void bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t, 254 bus_size_t, u_int32_t, size_t); 255 void bus_space_set_region_8(bus_space_tag_t, bus_space_handle_t, 256 bus_size_t, u_int64_t, size_t); 257 258 void bus_space_copy_region_1(bus_space_tag_t, bus_space_handle_t, 259 bus_size_t, bus_space_handle_t, 260 bus_size_t, size_t); 261 void bus_space_copy_region_2(bus_space_tag_t, bus_space_handle_t, 262 bus_size_t, bus_space_handle_t, 263 bus_size_t, size_t); 264 void bus_space_copy_region_4(bus_space_tag_t, bus_space_handle_t, 265 bus_size_t, bus_space_handle_t, 266 bus_size_t, size_t); 267 void bus_space_copy_region_8(bus_space_tag_t, bus_space_handle_t, 268 bus_size_t, bus_space_handle_t, 269 bus_size_t, size_t); 270 271 /* 272 * bus_dma(9) 273 */ 274 275 /* Flags used in various bus DMA methods. */ 276 #define BUS_DMA_WAITOK 0x000 /* safe to sleep (pseudo-flag) */ 277 #define BUS_DMA_NOWAIT 0x001 /* not safe to sleep */ 278 #define BUS_DMA_ALLOCNOW 0x002 /* perform resource allocation now */ 279 #define BUS_DMA_COHERENT 0x004 /* hint: map memory DMA coherent */ 280 #define BUS_DMA_STREAMING 0x008 /* hint: sequential, unidirectional */ 281 #define BUS_DMA_BUS1 0x010 /* placeholders for bus functions... */ 282 #define BUS_DMA_BUS2 0x020 283 #define BUS_DMA_BUS3 0x040 284 #define BUS_DMA_BUS4 0x080 285 #define BUS_DMA_READ 0x100 /* mapping is device -> memory only */ 286 #define BUS_DMA_WRITE 0x200 /* mapping is memory -> device only */ 287 #define BUS_DMA_NOCACHE 0x400 /* hint: map non-cached memory */ 288 289 /* Operations performed by bus_dmamap_sync(). */ 290 #define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */ 291 #define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */ 292 #define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */ 293 #define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */ 294 295 int bus_dmamap_create(bus_dma_tag_t, bus_size_t, int, bus_size_t, 296 bus_size_t, int, bus_dmamap_t *); 297 void bus_dmamap_destroy(bus_dma_tag_t, bus_dmamap_t); 298 int bus_dmamap_load(bus_dma_tag_t, bus_dmamap_t, void *, bus_size_t, 299 struct proc *, int); 300 int bus_dmamap_load_mbuf(bus_dma_tag_t, bus_dmamap_t, 301 struct mbuf *, int); 302 int bus_dmamap_load_uio(bus_dma_tag_t, bus_dmamap_t, 303 struct uio *, int); 304 int bus_dmamap_load_raw(bus_dma_tag_t, bus_dmamap_t, 305 bus_dma_segment_t *, int, bus_size_t, int); 306 void bus_dmamap_unload(bus_dma_tag_t, bus_dmamap_t); 307 void bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_addr_t, 308 bus_size_t, int); 309 310 int bus_dmamem_alloc(bus_dma_tag_t, bus_size_t, bus_size_t, 311 bus_size_t, bus_dma_segment_t *, 312 int, int *, int); 313 void bus_dmamem_free(bus_dma_tag_t, bus_dma_segment_t *, int); 314 int bus_dmamem_map(bus_dma_tag_t, bus_dma_segment_t *, int, 315 size_t, void **, int); 316 void bus_dmamem_unmap(bus_dma_tag_t, void *, size_t); 317 paddr_t bus_dmamem_mmap(bus_dma_tag_t, bus_dma_segment_t *, int, 318 off_t, int, int); 319 320 int bus_dmatag_subregion(bus_dma_tag_t, bus_addr_t, bus_addr_t, 321 bus_dma_tag_t *, int); 322 void bus_dmatag_destroy(bus_dma_tag_t); 323 324 #endif /* _SYS_BUS_PROTO_H_ */ 325