1 /* $NetBSD: bus.h,v 1.30 2021/01/23 19:38:08 christos Exp $ */ 2 3 /*- 4 * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 9 * NASA Ames Research Center. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 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) 1997 Scott Reynolds. All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 1. Redistributions of source code must retain the above copyright 40 * notice, this list of conditions and the following disclaimer. 41 * 2. Redistributions in binary form must reproduce the above copyright 42 * notice, this list of conditions and the following disclaimer in the 43 * documentation and/or other materials provided with the distribution. 44 * 3. The name of the author may not be used to endorse or promote products 45 * derived from this software without specific prior written permission 46 * 47 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 48 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 49 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 50 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 51 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 52 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 53 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 54 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 55 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 56 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 57 */ 58 59 #ifndef _MAC68K_BUS_H_ 60 #define _MAC68K_BUS_H_ 61 62 /* 63 * Value for the mac68k bus space tag, not to be used directly by MI code. 64 */ 65 #define MAC68K_BUS_SPACE_MEM 0 /* space is mem space */ 66 67 #define __BUS_SPACE_HAS_STREAM_METHODS 1 68 69 /* 70 * Bus address and size types 71 */ 72 typedef u_long bus_addr_t; 73 typedef u_long bus_size_t; 74 75 #define PRIxBUSADDR "lx" 76 #define PRIxBUSSIZE "lx" 77 #define PRIuBUSSIZE "lu" 78 /* 79 * Access methods for bus resources and address space. 80 */ 81 #define BSH_T struct bus_space_handle_s 82 typedef int bus_space_tag_t; 83 typedef struct bus_space_handle_s { 84 u_long base; 85 int swapped; 86 int stride; 87 88 u_int8_t (*bsr1)(bus_space_tag_t, BSH_T *, bus_size_t); 89 u_int16_t (*bsr2)(bus_space_tag_t, BSH_T *, bus_size_t); 90 u_int32_t (*bsr4)(bus_space_tag_t, BSH_T *, bus_size_t); 91 u_int8_t (*bsrs1)(bus_space_tag_t, BSH_T *, bus_size_t); 92 u_int16_t (*bsrs2)(bus_space_tag_t, BSH_T *, bus_size_t); 93 u_int32_t (*bsrs4)(bus_space_tag_t, BSH_T *, bus_size_t); 94 void (*bsrm1)(bus_space_tag_t, BSH_T *, bus_size_t, 95 u_int8_t *, size_t); 96 void (*bsrm2)(bus_space_tag_t, BSH_T *, bus_size_t, 97 u_int16_t *, size_t); 98 void (*bsrm4)(bus_space_tag_t, BSH_T *, bus_size_t, 99 u_int32_t *, size_t); 100 void (*bsrms1)(bus_space_tag_t, BSH_T *, bus_size_t, 101 u_int8_t *, size_t); 102 void (*bsrms2)(bus_space_tag_t, BSH_T *, bus_size_t, 103 u_int16_t *, size_t); 104 void (*bsrms4)(bus_space_tag_t, BSH_T *, bus_size_t, 105 u_int32_t *, size_t); 106 void (*bsrr1)(bus_space_tag_t, BSH_T *, bus_size_t, 107 u_int8_t *, size_t); 108 void (*bsrr2)(bus_space_tag_t, BSH_T *, bus_size_t, 109 u_int16_t *, size_t); 110 void (*bsrr4)(bus_space_tag_t, BSH_T *, bus_size_t, 111 u_int32_t *, size_t); 112 void (*bsrrs1)(bus_space_tag_t, BSH_T *, bus_size_t, 113 u_int8_t *, size_t); 114 void (*bsrrs2)(bus_space_tag_t, BSH_T *, bus_size_t, 115 u_int16_t *, size_t); 116 void (*bsrrs4)(bus_space_tag_t, BSH_T *, bus_size_t, 117 u_int32_t *, size_t); 118 void (*bsw1)(bus_space_tag_t, BSH_T *, bus_size_t, u_int8_t); 119 void (*bsw2)(bus_space_tag_t, BSH_T *, bus_size_t, 120 u_int16_t); 121 void (*bsw4)(bus_space_tag_t, BSH_T *, bus_size_t, 122 u_int32_t); 123 void (*bsws1)(bus_space_tag_t, BSH_T *, bus_size_t, 124 u_int8_t); 125 void (*bsws2)(bus_space_tag_t, BSH_T *, bus_size_t, 126 u_int16_t); 127 void (*bsws4)(bus_space_tag_t, BSH_T *, bus_size_t, 128 u_int32_t); 129 void (*bswm1)(bus_space_tag_t, BSH_T *, bus_size_t, 130 const u_int8_t *, size_t); 131 void (*bswm2)(bus_space_tag_t, BSH_T *, bus_size_t, 132 const u_int16_t *, size_t); 133 void (*bswm4)(bus_space_tag_t, BSH_T *, bus_size_t, 134 const u_int32_t *, size_t); 135 void (*bswms1)(bus_space_tag_t, BSH_T *, bus_size_t, 136 const u_int8_t *, size_t); 137 void (*bswms2)(bus_space_tag_t, BSH_T *, bus_size_t, 138 const u_int16_t *, size_t); 139 void (*bswms4)(bus_space_tag_t, BSH_T *, bus_size_t, 140 const u_int32_t *, size_t); 141 void (*bswr1)(bus_space_tag_t, BSH_T *, bus_size_t, 142 const u_int8_t *, size_t); 143 void (*bswr2)(bus_space_tag_t, BSH_T *, bus_size_t, 144 const u_int16_t *, size_t); 145 void (*bswr4)(bus_space_tag_t, BSH_T *, bus_size_t, 146 const u_int32_t *, size_t); 147 void (*bswrs1)(bus_space_tag_t, BSH_T *, bus_size_t, 148 const u_int8_t *, size_t); 149 void (*bswrs2)(bus_space_tag_t, BSH_T *, bus_size_t, 150 const u_int16_t *, size_t); 151 void (*bswrs4)(bus_space_tag_t, BSH_T *, bus_size_t, 152 const u_int32_t *, size_t); 153 void (*bssm1)(bus_space_tag_t, BSH_T *, bus_size_t, 154 u_int8_t v, size_t); 155 void (*bssm2)(bus_space_tag_t, BSH_T *, bus_size_t, 156 u_int16_t v, size_t); 157 void (*bssm4)(bus_space_tag_t, BSH_T *, bus_size_t, 158 u_int32_t v, size_t); 159 void (*bssr1)(bus_space_tag_t, BSH_T *, bus_size_t, 160 u_int8_t v, size_t); 161 void (*bssr2)(bus_space_tag_t, BSH_T *, bus_size_t, 162 u_int16_t v, size_t); 163 void (*bssr4)(bus_space_tag_t, BSH_T *, bus_size_t, 164 u_int32_t v, size_t); 165 } bus_space_handle_t; 166 #undef BSH_T 167 168 void mac68k_bus_space_handle_swapped(bus_space_tag_t, 169 bus_space_handle_t *); 170 void mac68k_bus_space_handle_set_stride(bus_space_tag_t, 171 bus_space_handle_t *, int); 172 173 /* 174 * int bus_space_map(bus_space_tag_t t, bus_addr_t addr, 175 * bus_size_t size, int flags, bus_space_handle_t *bshp); 176 * 177 * Map a region of bus space. 178 */ 179 180 #define BUS_SPACE_MAP_CACHEABLE 0x01 181 #define BUS_SPACE_MAP_LINEAR 0x02 182 #define BUS_SPACE_MAP_PREFETCHABLE 0x04 183 184 int bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t, 185 int, bus_space_handle_t *); 186 187 /* 188 * void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, 189 * bus_size_t size); 190 * 191 * Unmap a region of bus space. 192 */ 193 194 void bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t); 195 196 /* 197 * int bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh, 198 * bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp); 199 * 200 * Get a new handle for a subregion of an already-mapped area of bus space. 201 */ 202 203 int bus_space_subregion(bus_space_tag_t, bus_space_handle_t, 204 bus_size_t, bus_size_t size, bus_space_handle_t *); 205 206 /* 207 * int bus_space_alloc(bus_space_tag_t t, bus_addr_t, rstart, 208 * bus_addr_t rend, bus_size_t size, bus_size_t align, 209 * bus_size_t boundary, int flags, bus_addr_t *addrp, 210 * bus_space_handle_t *bshp); 211 * 212 * Allocate a region of bus space. 213 */ 214 215 int bus_space_alloc(bus_space_tag_t, bus_addr_t rstart, 216 bus_addr_t rend, bus_size_t size, bus_size_t align, 217 bus_size_t boundary, int cacheable, bus_addr_t *addrp, 218 bus_space_handle_t *bshp); 219 220 /* 221 * int bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh, 222 * bus_size_t size); 223 * 224 * Free a region of bus space. 225 */ 226 227 void bus_space_free(bus_space_tag_t, bus_space_handle_t bsh, 228 bus_size_t size); 229 230 /* 231 * int mac68k_bus_space_probe(bus_space_tag_t t, bus_space_handle_t bsh, 232 * bus_size_t offset, int sz); 233 * 234 * Probe the bus at t/bsh/offset, using sz as the size of the load. 235 * 236 * This is a machine-dependent extension, and is not to be used by 237 * machine-independent code. 238 */ 239 240 int mac68k_bus_space_probe(bus_space_tag_t, 241 bus_space_handle_t bsh, bus_size_t, int sz); 242 243 /* 244 * u_intN_t bus_space_read_N(bus_space_tag_t tag, 245 * bus_space_handle_t bsh, bus_size_t offset); 246 * 247 * Read a 1, 2, 4, or 8 byte quantity from bus space 248 * described by tag/handle/offset. 249 */ 250 251 u_int8_t mac68k_bsr1(bus_space_tag_t, bus_space_handle_t *, bus_size_t); 252 u_int8_t mac68k_bsr1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t); 253 u_int16_t mac68k_bsr2(bus_space_tag_t, bus_space_handle_t *, bus_size_t); 254 u_int16_t mac68k_bsr2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t); 255 u_int16_t mac68k_bsr2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t); 256 u_int16_t mac68k_bsrs2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t); 257 u_int32_t mac68k_bsr4(bus_space_tag_t, bus_space_handle_t *, bus_size_t); 258 u_int32_t mac68k_bsr4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t); 259 u_int32_t mac68k_bsr4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t); 260 u_int32_t mac68k_bsrs4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t); 261 262 #define bus_space_read_1(t,h,o) (h).bsr1((t), &(h), (o)) 263 #define bus_space_read_2(t,h,o) (h).bsr2((t), &(h), (o)) 264 #define bus_space_read_4(t,h,o) (h).bsr4((t), &(h), (o)) 265 #define bus_space_read_stream_1(t,h,o) (h).bsrs1((t), &(h), (o)) 266 #define bus_space_read_stream_2(t,h,o) (h).bsrs2((t), &(h), (o)) 267 #define bus_space_read_stream_4(t,h,o) (h).bsrs4((t), &(h), (o)) 268 269 /* 270 * void bus_space_read_multi_N(bus_space_tag_t tag, 271 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t *addr, 272 * size_t count); 273 * 274 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 275 * described by tag/handle/offset and copy into buffer provided. 276 */ 277 278 void mac68k_bsrm1(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 279 u_int8_t *, size_t); 280 void mac68k_bsrm1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 281 u_int8_t *, size_t); 282 void mac68k_bsrm2(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 283 u_int16_t *, size_t); 284 void mac68k_bsrm2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 285 u_int16_t *, size_t); 286 void mac68k_bsrm2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 287 u_int16_t *, size_t); 288 void mac68k_bsrms2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 289 u_int16_t *, size_t); 290 void mac68k_bsrm4(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 291 u_int32_t *, size_t); 292 void mac68k_bsrms4(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 293 u_int32_t *, size_t); 294 void mac68k_bsrm4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 295 u_int32_t *, size_t); 296 void mac68k_bsrm4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 297 u_int32_t *, size_t); 298 void mac68k_bsrms4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 299 u_int32_t *, size_t); 300 301 #if defined(DIAGNOSTIC) 302 #define bus_space_read_multi_1(t, h, o, a, c) do { \ 303 if ((c) == 0) \ 304 panic("bus_space_read_multi_1 called with zero count."); \ 305 (h).bsrm1(t,&(h),o,a,c); } while (0) 306 #define bus_space_read_multi_2(t, h, o, a, c) do { \ 307 if ((c) == 0) \ 308 panic("bus_space_read_multi_2 called with zero count."); \ 309 (h).bsrm2(t,&(h),o,a,c); } while (0) 310 #define bus_space_read_multi_4(t, h, o, a, c) do { \ 311 if ((c) == 0) \ 312 panic("bus_space_read_multi_4 called with zero count."); \ 313 (h).bsrm4(t,&(h),o,a,c); } while (0) 314 #define bus_space_read_multi_stream_1(t, h, o, a, c) do { \ 315 if ((c) == 0) \ 316 panic("bus_space_read_multi_stream_1 called with count=0."); \ 317 (h).bsrms1(t,&(h),o,a,c); } while (0) 318 #define bus_space_read_multi_stream_2(t, h, o, a, c) do { \ 319 if ((c) == 0) \ 320 panic("bus_space_read_multi_stream_2 called with count=0."); \ 321 (h).bsrms2(t,&(h),o,a,c); } while (0) 322 #define bus_space_read_multi_stream_4(t, h, o, a, c) do { \ 323 if ((c) == 0) \ 324 panic("bus_space_read_multi_stream_4 called with count=0."); \ 325 (h).bsrms4(t,&(h),o,a,c); } while (0) 326 #else 327 #define bus_space_read_multi_1(t, h, o, a, c) \ 328 do { if (c) (h).bsrm1(t, &(h), o, a, c); } while (0) 329 #define bus_space_read_multi_2(t, h, o, a, c) \ 330 do { if (c) (h).bsrm2(t, &(h), o, a, c); } while (0) 331 #define bus_space_read_multi_4(t, h, o, a, c) \ 332 do { if (c) (h).bsrm4(t, &(h), o, a, c); } while (0) 333 #define bus_space_read_multi_stream_1(t, h, o, a, c) \ 334 do { if (c) (h).bsrms1(t, &(h), o, a, c); } while (0) 335 #define bus_space_read_multi_stream_2(t, h, o, a, c) \ 336 do { if (c) (h).bsrms2(t, &(h), o, a, c); } while (0) 337 #define bus_space_read_multi_stream_4(t, h, o, a, c) \ 338 do { if (c) (h).bsrms4(t, &(h), o, a, c); } while (0) 339 #endif 340 341 /* 342 * void bus_space_read_region_N(bus_space_tag_t tag, 343 * bus_space_handle_t bsh, bus_size_t offset, 344 * u_intN_t *addr, size_t count); 345 * 346 * Read `count' 1, 2, 4, or 8 byte quantities from bus space 347 * described by tag/handle and starting at `offset' and copy into 348 * buffer provided. 349 */ 350 351 void mac68k_bsrr1(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 352 u_int8_t *, size_t); 353 void mac68k_bsrr1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 354 u_int8_t *, size_t); 355 void mac68k_bsrr2(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 356 u_int16_t *, size_t); 357 void mac68k_bsrr2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 358 u_int16_t *, size_t); 359 void mac68k_bsrr2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 360 u_int16_t *, size_t); 361 void mac68k_bsrrs2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 362 u_int16_t *, size_t); 363 void mac68k_bsrr4(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 364 u_int32_t *, size_t); 365 void mac68k_bsrr4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 366 u_int32_t *, size_t); 367 void mac68k_bsrr4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 368 u_int32_t *, size_t); 369 void mac68k_bsrrs4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 370 u_int32_t *, size_t); 371 372 #if defined(DIAGNOSTIC) 373 #define bus_space_read_region_1(t, h, o, a, c) do { \ 374 if ((c) == 0) \ 375 panic("bus_space_read_region_1 called with zero count."); \ 376 (h).bsrr1(t,&(h),o,a,c); } while (0) 377 #define bus_space_read_region_2(t, h, o, a, c) do { \ 378 if ((c) == 0) \ 379 panic("bus_space_read_region_2 called with zero count."); \ 380 (h).bsrr2(t,&(h),o,a,c); } while (0) 381 #define bus_space_read_region_4(t, h, o, a, c) do { \ 382 if ((c) == 0) \ 383 panic("bus_space_read_region_4 called with zero count."); \ 384 (h).bsrr4(t,&(h),o,a,c); } while (0) 385 #define bus_space_read_region_stream_1(t, h, o, a, c) do { \ 386 if ((c) == 0) \ 387 panic("bus_space_read_region_stream_1 called with count=0."); \ 388 (h).bsrrs1(t,&(h),o,a,c); } while (0) 389 #define bus_space_read_region_stream_2(t, h, o, a, c) do { \ 390 if ((c) == 0) \ 391 panic("bus_space_read_region_stream_2 called with count=0."); \ 392 (h).bsrrs2(t,&(h),o,a,c); } while (0) 393 #define bus_space_read_region_stream_4(t, h, o, a, c) do { \ 394 if ((c) == 0) \ 395 panic("bus_space_read_region_stream_4 called with count=0."); \ 396 (h).bsrrs4(t,&(h),o,a,c); } while (0) 397 #else 398 #define bus_space_read_region_1(t, h, o, a, c) \ 399 do { if (c) (h).bsrr1(t,&(h),o,a,c); } while (0) 400 #define bus_space_read_region_2(t, h, o, a, c) \ 401 do { if (c) (h).bsrr2(t,&(h),o,a,c); } while (0) 402 #define bus_space_read_region_4(t, h, o, a, c) \ 403 do { if (c) (h).bsrr4(t,&(h),o,a,c); } while (0) 404 #define bus_space_read_region_stream_1(t, h, o, a, c) \ 405 do { if (c) (h).bsrrs1(t,&(h),o,a,c); } while (0) 406 #define bus_space_read_region_stream_2(t, h, o, a, c) \ 407 do { if (c) (h).bsrrs2(t,&(h),o,a,c); } while (0) 408 #define bus_space_read_region_stream_4(t, h, o, a, c) \ 409 do { if (c) (h).bsrrs4(t,&(h),o,a,c); } while (0) 410 #endif 411 412 /* 413 * void bus_space_write_N(bus_space_tag_t tag, 414 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t value); 415 * 416 * Write the 1, 2, 4, or 8 byte value `value' to bus space 417 * described by tag/handle/offset. 418 */ 419 420 void mac68k_bsw1(bus_space_tag_t, bus_space_handle_t *, bus_size_t, u_int8_t); 421 void mac68k_bsw1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 422 u_int8_t); 423 void mac68k_bsw2(bus_space_tag_t, bus_space_handle_t *, bus_size_t, u_int16_t); 424 void mac68k_bsw2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 425 u_int16_t); 426 void mac68k_bsw2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 427 u_int16_t); 428 void mac68k_bsws2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 429 u_int16_t); 430 void mac68k_bsw4(bus_space_tag_t, bus_space_handle_t *, bus_size_t, u_int32_t); 431 void mac68k_bsw4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 432 u_int32_t); 433 void mac68k_bsw4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 434 u_int32_t); 435 void mac68k_bsws4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 436 u_int32_t); 437 438 #define bus_space_write_1(t, h, o, v) (h).bsw1(t, &(h), o, v) 439 #define bus_space_write_2(t, h, o, v) (h).bsw2(t, &(h), o, v) 440 #define bus_space_write_4(t, h, o, v) (h).bsw4(t, &(h), o, v) 441 #define bus_space_write_stream_1(t, h, o, v) (h).bsws1(t, &(h), o, v) 442 #define bus_space_write_stream_2(t, h, o, v) (h).bsws2(t, &(h), o, v) 443 #define bus_space_write_stream_4(t, h, o, v) (h).bsws4(t, &(h), o, v) 444 445 /* 446 * void bus_space_write_multi_N(bus_space_tag_t tag, 447 * bus_space_handle_t bsh, bus_size_t offset, const u_intN_t *addr, 448 * size_t count); 449 * 450 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 451 * provided to bus space described by tag/handle/offset. 452 */ 453 454 void mac68k_bswm1(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 455 const u_int8_t *, size_t); 456 void mac68k_bswm1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 457 const u_int8_t *, size_t); 458 void mac68k_bswm2(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 459 const u_int16_t *, size_t); 460 void mac68k_bswm2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 461 const u_int16_t *, size_t); 462 void mac68k_bswm2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 463 const u_int16_t *, size_t); 464 void mac68k_bswms2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 465 const u_int16_t *, size_t); 466 void mac68k_bswm4(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 467 const u_int32_t *, size_t); 468 void mac68k_bswm4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 469 const u_int32_t *, size_t); 470 void mac68k_bswm4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 471 const u_int32_t *, size_t); 472 void mac68k_bswms4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 473 const u_int32_t *, size_t); 474 475 #if defined(DIAGNOSTIC) 476 #define bus_space_write_multi_1(t, h, o, a, c) do { \ 477 if ((c) == 0) \ 478 panic("bus_space_write_multi_1 called with zero count."); \ 479 (h).bswm1(t,&(h),o,a,c); } while (0) 480 #define bus_space_write_multi_2(t, h, o, a, c) do { \ 481 if ((c) == 0) \ 482 panic("bus_space_write_multi_2 called with zero count."); \ 483 (h).bswm2(t,&(h),o,a,c); } while (0) 484 #define bus_space_write_multi_4(t, h, o, a, c) do { \ 485 if ((c) == 0) \ 486 panic("bus_space_write_multi_4 called with zero count."); \ 487 (h).bswm4(t,&(h),o,a,c); } while (0) 488 #define bus_space_write_multi_stream_1(t, h, o, a, c) do { \ 489 if ((c) == 0) \ 490 panic("bus_space_write_multi_stream_1 called with count=0."); \ 491 (h).bswms1(t,&(h),o,a,c); } while (0) 492 #define bus_space_write_multi_stream_2(t, h, o, a, c) do { \ 493 if ((c) == 0) \ 494 panic("bus_space_write_multi_stream_2 called with count=0."); \ 495 (h).bswms2(t,&(h),o,a,c); } while (0) 496 #define bus_space_write_multi_stream_4(t, h, o, a, c) do { \ 497 if ((c) == 0) \ 498 panic("bus_space_write_multi_stream_4 called with count=0."); \ 499 (h).bswms4(t,&(h),o,a,c); } while (0) 500 #else 501 #define bus_space_write_multi_1(t, h, o, a, c) \ 502 do { if (c) (h).bswm1(t, &(h), o, a, c); } while (0) 503 #define bus_space_write_multi_2(t, h, o, a, c) \ 504 do { if (c) (h).bswm2(t, &(h), o, a, c); } while (0) 505 #define bus_space_write_multi_4(t, h, o, a, c) \ 506 do { if (c) (h).bswm4(t, &(h), o, a, c); } while (0) 507 #define bus_space_write_multi_stream_1(t, h, o, a, c) \ 508 do { if (c) (h).bswms1(t, &(h), o, a, c); } while (0) 509 #define bus_space_write_multi_stream_2(t, h, o, a, c) \ 510 do { if (c) (h).bswms2(t, &(h), o, a, c); } while (0) 511 #define bus_space_write_multi_stream_4(t, h, o, a, c) \ 512 do { if (c) (h).bswms4(t, &(h), o, a, c); } while (0) 513 #endif 514 515 /* 516 * void bus_space_write_region_N(bus_space_tag_t tag, 517 * bus_space_handle_t bsh, bus_size_t offset, const u_intN_t *addr, 518 * size_t count); 519 * 520 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided 521 * to bus space described by tag/handle starting at `offset'. 522 */ 523 524 void mac68k_bswr1(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 525 const u_int8_t *, size_t); 526 void mac68k_bswr1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 527 const u_int8_t *, size_t); 528 void mac68k_bswr2(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 529 const u_int16_t *, size_t); 530 void mac68k_bswr2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 531 const u_int16_t *, size_t); 532 void mac68k_bswr2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 533 const u_int16_t *, size_t); 534 void mac68k_bswrs2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 535 const u_int16_t *, size_t); 536 void mac68k_bswr4(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 537 const u_int32_t *, size_t); 538 void mac68k_bswr4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 539 const u_int32_t *, size_t); 540 void mac68k_bswr4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 541 const u_int32_t *, size_t); 542 void mac68k_bswrs4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 543 const u_int32_t *, size_t); 544 545 #if defined(DIAGNOSTIC) 546 #define bus_space_write_region_1(t, h, o, a, c) do { \ 547 if ((c) == 0) \ 548 panic("bus_space_write_region_1 called with zero count."); \ 549 (h).bswr1(t,&(h),o,a,c); } while (0) 550 #define bus_space_write_region_2(t, h, o, a, c) do { \ 551 if ((c) == 0) \ 552 panic("bus_space_write_region_2 called with zero count."); \ 553 (h).bswr2(t,&(h),o,a,c); } while (0) 554 #define bus_space_write_region_4(t, h, o, a, c) do { \ 555 if ((c) == 0) \ 556 panic("bus_space_write_region_4 called with zero count."); \ 557 (h).bswr4(t,&(h),o,a,c); } while (0) 558 #define bus_space_write_region_stream_1(t, h, o, a, c) do { \ 559 if ((c) == 0) \ 560 panic("bus_space_write_region_stream_1 called with count=0."); \ 561 (h).bswrs1(t,&(h),o,a,c); } while (0) 562 #define bus_space_write_region_stream_2(t, h, o, a, c) do { \ 563 if ((c) == 0) \ 564 panic("bus_space_write_region_stream_2 called with count=0."); \ 565 (h).bswrs2(t,&(h),o,a,c); } while (0) 566 #define bus_space_write_region_stream_4(t, h, o, a, c) do { \ 567 if ((c) == 0) \ 568 panic("bus_space_write_region_stream_4 called with count=0."); \ 569 (h).bswrs4(t,&(h),o,a,c); } while (0) 570 #else 571 #define bus_space_write_region_1(t, h, o, a, c) \ 572 do { if (c) (h).bswr1(t,&(h),o,a,c); } while (0) 573 #define bus_space_write_region_2(t, h, o, a, c) \ 574 do { if (c) (h).bswr2(t,&(h),o,a,c); } while (0) 575 #define bus_space_write_region_4(t, h, o, a, c) \ 576 do { if (c) (h).bswr4(t,&(h),o,a,c); } while (0) 577 #define bus_space_write_region_stream_1(t, h, o, a, c) \ 578 do { if (c) (h).bswrs1(t,&(h),o,a,c); } while (0) 579 #define bus_space_write_region_stream_2(t, h, o, a, c) \ 580 do { if (c) (h).bswrs2(t,&(h),o,a,c); } while (0) 581 #define bus_space_write_region_stream_4(t, h, o, a, c) \ 582 do { if (c) (h).bswrs4(t,&(h),o,a,c); } while (0) 583 #endif 584 585 /* 586 * void bus_space_set_multi_N(bus_space_tag_t tag, 587 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 588 * size_t count); 589 * 590 * Write the 1, 2, 4, or 8 byte value `val' to bus space described 591 * by tag/handle/offset `count' times. 592 */ 593 594 void mac68k_bssm1(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 595 u_int8_t, size_t); 596 void mac68k_bssm1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 597 u_int8_t, size_t); 598 void mac68k_bssm2(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 599 u_int16_t, size_t); 600 void mac68k_bssm2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 601 u_int16_t, size_t); 602 void mac68k_bssm2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 603 u_int16_t, size_t); 604 void mac68k_bssm4(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 605 u_int32_t, size_t); 606 void mac68k_bssm4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 607 u_int32_t, size_t); 608 void mac68k_bssm4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 609 u_int32_t, size_t); 610 611 #if defined(DIAGNOSTIC) 612 #define bus_space_set_multi_1(t, h, o, val, c) do { \ 613 if ((c) == 0) \ 614 panic("bus_space_set_multi_1 called with zero count."); \ 615 (h).bssm1(t,&(h),o,val,c); } while (0) 616 #define bus_space_set_multi_2(t, h, o, val, c) do { \ 617 if ((c) == 0) \ 618 panic("bus_space_set_multi_2 called with zero count."); \ 619 (h).bssm2(t,&(h),o,val,c); } while (0) 620 #define bus_space_set_multi_4(t, h, o, val, c) do { \ 621 if ((c) == 0) \ 622 panic("bus_space_set_multi_4 called with zero count."); \ 623 (h).bssm4(t,&(h),o,val,c); } while (0) 624 #else 625 #define bus_space_set_multi_1(t, h, o, val, c) \ 626 do { if (c) (h).bssm1(t,&(h),o,val,c); } while (0) 627 #define bus_space_set_multi_2(t, h, o, val, c) \ 628 do { if (c) (h).bssm2(t,&(h),o,val,c); } while (0) 629 #define bus_space_set_multi_4(t, h, o, val, c) \ 630 do { if (c) (h).bssm4(t,&(h),o,val,c); } while (0) 631 #endif 632 633 /* 634 * void bus_space_set_region_N(bus_space_tag_t tag, 635 * bus_space_handle_t bsh, bus_size_t, u_intN_t val, 636 * size_t count); 637 * 638 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 639 * by tag/handle starting at `offset'. 640 */ 641 642 void mac68k_bssr1(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 643 u_int8_t, size_t); 644 void mac68k_bssr1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 645 u_int8_t, size_t); 646 void mac68k_bssr2(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 647 u_int16_t, size_t); 648 void mac68k_bssr2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 649 u_int16_t, size_t); 650 void mac68k_bssr2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 651 u_int16_t, size_t); 652 void mac68k_bssr4(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 653 u_int32_t, size_t); 654 void mac68k_bssr4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 655 u_int32_t, size_t); 656 void mac68k_bssr4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t, 657 u_int32_t, size_t); 658 659 #if defined(DIAGNOSTIC) 660 #define bus_space_set_region_1(t, h, o, val, c) do { \ 661 if ((c) == 0) \ 662 panic("bus_space_set_region_1 called with zero count."); \ 663 (h).bssr1(t,&(h),o,val,c); } while (0) 664 #define bus_space_set_region_2(t, h, o, val, c) do { \ 665 if ((c) == 0) \ 666 panic("bus_space_set_region_2 called with zero count."); \ 667 (h).bssr2(t,&(h),o,val,c); } while (0) 668 #define bus_space_set_region_4(t, h, o, val, c) do { \ 669 if ((c) == 0) \ 670 panic("bus_space_set_region_4 called with zero count."); \ 671 (h).bssr4(t,&(h),o,val,c); } while (0) 672 #else 673 #define bus_space_set_region_1(t, h, o, val, c) \ 674 do { if (c) (h).bssr1(t,&(h),o,val,c); } while (0) 675 #define bus_space_set_region_2(t, h, o, val, c) \ 676 do { if (c) (h).bssr2(t,&(h),o,val,c); } while (0) 677 #define bus_space_set_region_4(t, h, o, val, c) \ 678 do { if (c) (h).bssr4(t,&(h),o,val,c); } while (0) 679 #endif 680 681 /* 682 * void bus_space_copy_N(bus_space_tag_t tag, 683 * bus_space_handle_t bsh1, bus_size_t off1, 684 * bus_space_handle_t bsh2, bus_size_t off2, size_t count); 685 * 686 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 687 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 688 */ 689 690 #define __MAC68K_copy_region_N(BYTES) \ 691 static __inline void __CONCAT(bus_space_copy_region_,BYTES) \ 692 (bus_space_tag_t, \ 693 bus_space_handle_t, bus_size_t, \ 694 bus_space_handle_t, bus_size_t, \ 695 bus_size_t); \ 696 \ 697 static __inline void \ 698 __CONCAT(bus_space_copy_region_,BYTES)( \ 699 bus_space_tag_t t, \ 700 bus_space_handle_t h1, \ 701 bus_size_t o1, \ 702 bus_space_handle_t h2, \ 703 bus_size_t o2, \ 704 bus_size_t c) \ 705 { \ 706 bus_size_t o; \ 707 \ 708 if ((h1.base + o1) >= (h2.base + o2)) { \ 709 /* src after dest: copy forward */ \ 710 for (o = 0; c != 0; c--, o += BYTES) \ 711 __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \ 712 __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \ 713 } else { \ 714 /* dest after src: copy backwards */ \ 715 for (o = (c - 1) * BYTES; c != 0; c--, o -= BYTES) \ 716 __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \ 717 __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \ 718 } \ 719 } 720 __MAC68K_copy_region_N(1) 721 __MAC68K_copy_region_N(2) 722 __MAC68K_copy_region_N(4) 723 724 #undef __MAC68K_copy_region_N 725 726 /* 727 * Bus read/write barrier methods. 728 * 729 * void bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh, 730 * bus_size_t offset, bus_size_t len, int flags); 731 * 732 * Note: the 680x0 does not currently require barriers, but we must 733 * provide the flags to MI code. 734 */ 735 #define bus_space_barrier(t, h, o, l, f) \ 736 ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f))) 737 #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ 738 #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ 739 740 /* 741 * void *bus_space_vaddr(bus_space_tag_t, bus_space_handle_t); 742 * 743 * Get the kernel virtual address for the mapped bus space. 744 */ 745 #define bus_space_vaddr(t, h) ((void)(t), (void *)(h.base)) 746 747 #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) 748 749 #include <m68k/bus_dma.h> 750 751 #endif /* _MAC68K_BUS_H_ */ 752