1 1.30 skrll /* $NetBSD: bus.h,v 1.30 2019/09/23 16:17:54 skrll Exp $ */ 2 1.1 is 3 1.1 is /* 4 1.1 is * Copyright (c) 1996 Leo Weppelman. All rights reserved. 5 1.1 is * 6 1.1 is * Redistribution and use in source and binary forms, with or without 7 1.1 is * modification, are permitted provided that the following conditions 8 1.1 is * are met: 9 1.1 is * 1. Redistributions of source code must retain the above copyright 10 1.1 is * notice, this list of conditions and the following disclaimer. 11 1.1 is * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 is * notice, this list of conditions and the following disclaimer in the 13 1.1 is * documentation and/or other materials provided with the distribution. 14 1.1 is * 15 1.1 is * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 1.1 is * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 1.1 is * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 1.1 is * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 1.1 is * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 1.1 is * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 1.1 is * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 1.1 is * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 1.1 is * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 1.1 is * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 1.1 is */ 26 1.1 is 27 1.1 is #ifndef _AMIGA_BUS_H_ 28 1.1 is #define _AMIGA_BUS_H_ 29 1.1 is 30 1.4 is #include <sys/types.h> 31 1.5 is 32 1.12 is /* for public use: */ 33 1.12 is 34 1.1 is /* 35 1.1 is * Memory addresses (in bus space) 36 1.1 is */ 37 1.5 is 38 1.4 is typedef u_int32_t bus_addr_t; 39 1.4 is typedef u_int32_t bus_size_t; 40 1.1 is 41 1.30 skrll #define PRIxBUSADDR "x" 42 1.30 skrll #define PRIxBUSSIZE "x" 43 1.30 skrll #define PRIuBUSSIZE "u" 44 1.30 skrll 45 1.1 is /* 46 1.1 is * Access methods for bus resources and address space. 47 1.1 is */ 48 1.4 is typedef struct bus_space_tag *bus_space_tag_t; 49 1.4 is typedef u_long bus_space_handle_t; 50 1.4 is 51 1.30 skrll #define PRIxBSH "lx" 52 1.30 skrll 53 1.12 is /* unpublic, but needed by method implementors */ 54 1.12 is 55 1.5 is /* 56 1.5 is * Lazyness macros for function declarations. 57 1.5 is */ 58 1.5 is 59 1.4 is #define bsr(what, typ) \ 60 1.12 is typ (what)(bus_space_handle_t, bus_addr_t) 61 1.4 is 62 1.4 is #define bsw(what, typ) \ 63 1.12 is void (what)(bus_space_handle_t, bus_addr_t, unsigned) 64 1.4 is 65 1.4 is #define bsrm(what, typ) \ 66 1.12 is void (what)(bus_space_handle_t, bus_size_t, typ *, bus_size_t) 67 1.4 is 68 1.4 is #define bswm(what, typ) \ 69 1.12 is void (what)(bus_space_handle_t, bus_size_t, const typ *, bus_size_t) 70 1.4 is 71 1.5 is #define bssr(what, typ) \ 72 1.12 is void (what)(bus_space_handle_t, bus_size_t, unsigned, bus_size_t) 73 1.5 is 74 1.5 is #define bscr(what, typ) \ 75 1.12 is void (what)(bus_space_handle_t, bus_size_t, \ 76 1.12 is bus_space_handle_t, bus_size_t, bus_size_t) 77 1.5 is 78 1.5 is /* 79 1.5 is * Implementation specific structures. 80 1.5 is * XXX Don't use outside of bus_space definitions! 81 1.5 is * XXX maybe this should be encapsuled in a non-global .h file? 82 1.5 is */ 83 1.5 is 84 1.5 is struct bus_space_tag { 85 1.5 is bus_addr_t base; 86 1.9 is const struct amiga_bus_space_methods *absm; 87 1.5 is }; 88 1.5 is 89 1.4 is struct amiga_bus_space_methods { 90 1.5 is 91 1.12 is /* map, unmap, etc */ 92 1.12 is 93 1.12 is int (*bsm)(bus_space_tag_t, 94 1.12 is bus_addr_t, bus_size_t, int, bus_space_handle_t *); 95 1.12 is 96 1.12 is int (*bsms)(bus_space_handle_t, 97 1.12 is bus_size_t, bus_size_t, bus_space_handle_t *); 98 1.12 is 99 1.12 is void (*bsu)(bus_space_handle_t, bus_size_t); 100 1.12 is 101 1.12 is /* placeholders for currently not implemented alloc and free */ 102 1.12 is 103 1.12 is void *bsa; 104 1.12 is void *bsf; 105 1.12 is 106 1.12 is /* 8 bit methods */ 107 1.12 is 108 1.12 is bsr(*bsr1, u_int8_t); 109 1.12 is bsw(*bsw1, u_int8_t); 110 1.12 is bsrm(*bsrm1, u_int8_t); 111 1.12 is bswm(*bswm1, u_int8_t); 112 1.12 is bsrm(*bsrr1, u_int8_t); 113 1.12 is bswm(*bswr1, u_int8_t); 114 1.12 is bssr(*bssr1, u_int8_t); 115 1.12 is bscr(*bscr1, u_int8_t); 116 1.12 is 117 1.4 is /* 16bit methods */ 118 1.5 is 119 1.4 is bsr(*bsr2, u_int16_t); 120 1.4 is bsw(*bsw2, u_int16_t); 121 1.12 is bsr(*bsrs2, u_int16_t); 122 1.12 is bsw(*bsws2, u_int16_t); 123 1.4 is bsrm(*bsrm2, u_int16_t); 124 1.4 is bswm(*bswm2, u_int16_t); 125 1.12 is bsrm(*bsrms2, u_int16_t); 126 1.12 is bswm(*bswms2, u_int16_t); 127 1.4 is bsrm(*bsrr2, u_int16_t); 128 1.4 is bswm(*bswr2, u_int16_t); 129 1.7 is bsrm(*bsrrs2, u_int16_t); 130 1.7 is bswm(*bswrs2, u_int16_t); 131 1.5 is bssr(*bssr2, u_int16_t); 132 1.5 is bscr(*bscr2, u_int16_t); 133 1.4 is 134 1.24 rkujawa /* 32bit methods */ 135 1.24 rkujawa 136 1.24 rkujawa bsr(*bsr4, u_int32_t); 137 1.24 rkujawa bsw(*bsw4, u_int32_t); 138 1.24 rkujawa bsr(*bsrs4, u_int32_t); 139 1.24 rkujawa bsw(*bsws4, u_int32_t); 140 1.24 rkujawa bsrm(*bsrm4, u_int32_t); 141 1.24 rkujawa bswm(*bswm4, u_int32_t); 142 1.24 rkujawa bsrm(*bsrms4, u_int32_t); 143 1.24 rkujawa bswm(*bswms4, u_int32_t); 144 1.24 rkujawa bsrm(*bsrr4, u_int32_t); 145 1.24 rkujawa bswm(*bswr4, u_int32_t); 146 1.24 rkujawa bsrm(*bsrrs4, u_int32_t); 147 1.24 rkujawa bswm(*bswrs4, u_int32_t); 148 1.24 rkujawa bssr(*bssr4, u_int32_t); 149 1.24 rkujawa bscr(*bscr4, u_int32_t); 150 1.24 rkujawa 151 1.4 is }; 152 1.9 is 153 1.5 is /* 154 1.5 is * Macro definition of map, unmap, etc. 155 1.5 is */ 156 1.1 is 157 1.12 is #define bus_space_map(t, o, s, f, hp) \ 158 1.12 is ((t)->absm->bsm)((t), (o), (s), (f), (hp)) 159 1.2 is 160 1.12 is #define bus_space_subregion(t, h, o, s, hp) \ 161 1.12 is ((t)->absm->bsms)((h), (o), (s), (hp)) 162 1.1 is 163 1.12 is #define bus_space_unmap(t, h, s) \ 164 1.12 is ((t)->absm->bsu)((h), (s)) 165 1.1 is 166 1.5 is /* 167 1.12 is * Macro definition of _2 functions as indirect method array calls 168 1.5 is */ 169 1.5 is 170 1.12 is /* 0: Helper macros */ 171 1.12 is 172 1.12 is #define dbsdr(n, t, h, o) ((t)->absm->n)((h), (o)) 173 1.12 is #define dbsdw(n, t, h, o, v) ((t)->absm->n)((h), (o), (v)) 174 1.12 is #define dbsm(n, t, h, o, p, c) ((t)->absm->n)((h), (o), (p), (c)) 175 1.12 is #define dbss(n, t, h, o, v, c) ((t)->absm->n)((h), (o), (v), (c)) 176 1.12 is #define dbsc(n, t, h, o, v, c) ((t)->absm->n)((h), (o), (v), (c)) 177 1.1 is 178 1.12 is /* 1: byte-wide "functions" */ 179 1.1 is 180 1.12 is #define bus_space_read_1(t, h, o) dbsdr(bsr1, t, h, o) 181 1.12 is #define bus_space_write_1(t, h, o, v) dbsdw(bsw1, t, h, o, v) 182 1.12 is 183 1.12 is #define bus_space_read_multi_1(t, h, o, p, c) dbsm(bsrm1, t, h, o, p, c) 184 1.12 is #define bus_space_write_multi_1(t, h, o, p, c) dbsm(bswm1, t, h, o, p, c) 185 1.12 is 186 1.12 is #define bus_space_read_region_1(t, h, o, p, c) dbsm(bsrr1, t, h, o, p, c) 187 1.12 is #define bus_space_write_region_1(t, h, o, p, c) dbsm(bswr1, t, h, o, p, c) 188 1.12 is 189 1.12 is #define bus_space_set_region_1(t, h, o, v, c) dbss(bssr1, t, h, o, v, c) 190 1.12 is #define bus_space_copy_region_1(t, h, o, g, q, c) dbss(bscr1, t, h, o, g, q, c) 191 1.5 is 192 1.5 is 193 1.12 is /* 2: word-wide "functions" */ 194 1.5 is 195 1.12 is #define bus_space_read_2(t, h, o) dbsdr(bsr2, t, h, o) 196 1.12 is #define bus_space_write_2(t, h, o, v) dbsdw(bsw2, t, h, o, v) 197 1.12 is #define bus_space_read_stream_2(t, h, o) dbsdr(bsrs2, t, h, o) 198 1.12 is #define bus_space_write_stream_2(t, h, o, v) dbsdw(bsws2, t, h, o, v) 199 1.5 is 200 1.12 is #define bus_space_read_multi_2(t, h, o, p, c) dbsm(bsrm2, t, h, o, p, c) 201 1.12 is #define bus_space_write_multi_2(t, h, o, p, c) dbsm(bswm2, t, h, o, p, c) 202 1.5 is 203 1.12 is #define bus_space_read_multi_stream_2(t, h, o, p, c) \ 204 1.12 is dbsm(bsrms2, t, h, o, p, c) 205 1.5 is 206 1.12 is #define bus_space_write_multi_stream_2(t, h, o, p, c) \ 207 1.12 is dbsm(bswms2, t, h, o, p, c) 208 1.5 is 209 1.12 is #define bus_space_read_region_2(t, h, o, p, c) dbsm(bsrr2, t, h, o, p, c) 210 1.12 is #define bus_space_write_region_2(t, h, o, p, c) dbsm(bswr2, t, h, o, p, c) 211 1.5 is 212 1.7 is #define bus_space_read_region_stream_2(t, h, o, p, c) \ 213 1.12 is dbsm(bsrrs2, t, h, o, p, c) 214 1.5 is 215 1.7 is #define bus_space_write_region_stream_2(t, h, o, p, c) \ 216 1.12 is dbsm(bswrs2, t, h, o, p, c) 217 1.5 is 218 1.12 is #define bus_space_set_region_2(t, h, o, v, c) dbss(bssr2, t, h, o, v, c) 219 1.12 is #define bus_space_copy_region_2(t, h, o, g, q, c) dbss(bscr2, t, h, o, g, q, c) 220 1.10 drochner 221 1.24 rkujawa /* 4: long-wide "functions" */ 222 1.18 jdolecek 223 1.24 rkujawa #define bus_space_read_4(t, h, o) dbsdr(bsr4, t, h, o) 224 1.24 rkujawa #define bus_space_write_4(t, h, o, v) dbsdw(bsw4, t, h, o, v) 225 1.24 rkujawa #define bus_space_read_stream_4(t, h, o) dbsdr(bsrs4, t, h, o) 226 1.24 rkujawa #define bus_space_write_stream_4(t, h, o, v) dbsdw(bsws4, t, h, o, v) 227 1.18 jdolecek 228 1.24 rkujawa #define bus_space_read_multi_4(t, h, o, p, c) dbsm(bsrm4, t, h, o, p, c) 229 1.24 rkujawa #define bus_space_write_multi_4(t, h, o, p, c) dbsm(bswm4, t, h, o, p, c) 230 1.13 aymeric 231 1.13 aymeric #define bus_space_read_multi_stream_4(t, h, o, p, c) \ 232 1.24 rkujawa dbsm(bsrms4, t, h, o, p, c) 233 1.13 aymeric 234 1.13 aymeric #define bus_space_write_multi_stream_4(t, h, o, p, c) \ 235 1.24 rkujawa dbsm(bswms4, t, h, o, p, c) 236 1.24 rkujawa 237 1.24 rkujawa #define bus_space_read_region_4(t, h, o, p, c) dbsm(bsrr4, t, h, o, p, c) 238 1.24 rkujawa #define bus_space_write_region_4(t, h, o, p, c) dbsm(bswr4, t, h, o, p, c) 239 1.13 aymeric 240 1.19 aymeric #define bus_space_read_region_stream_4(t, h, o, p, c) \ 241 1.24 rkujawa dbsm(bsrrs4, t, h, o, p, c) 242 1.19 aymeric 243 1.19 aymeric #define bus_space_write_region_stream_4(t, h, o, p, c) \ 244 1.24 rkujawa dbsm(bswrs4, t, h, o, p, c) 245 1.24 rkujawa 246 1.24 rkujawa #define bus_space_set_region_4(t, h, o, v, c) dbss(bssr4, t, h, o, v, c) 247 1.24 rkujawa #define bus_space_copy_region_4(t, h, o, g, q, c) dbss(bscr4, t, h, o, g, q, c) 248 1.19 aymeric 249 1.11 is /* 250 1.11 is * Bus read/write barrier methods. 251 1.11 is * 252 1.21 dsl * void bus_space_barrier(bus_space_tag_t tag, 253 1.11 is * bus_space_handle_t bsh, bus_size_t offset, 254 1.21 dsl * bus_size_t len, int flags); 255 1.11 is * 256 1.11 is * Note: the 680x0 does not currently require barriers, but we must 257 1.11 is * provide the flags to MI code. 258 1.11 is */ 259 1.24 rkujawa void bus_space_barrier(bus_space_tag_t space, bus_space_handle_t handle, 260 1.24 rkujawa bus_size_t offset, bus_size_t length, int flags); 261 1.24 rkujawa 262 1.11 is #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ 263 1.11 is #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ 264 1.11 is 265 1.10 drochner #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) 266 1.12 is 267 1.12 is #define __BUS_SPACE_HAS_STREAM_METHODS 268 1.12 is 269 1.24 rkujawa paddr_t bus_space_mmap(bus_space_tag_t t, bus_addr_t addr, off_t off, int prot, 270 1.24 rkujawa int flags); 271 1.24 rkujawa 272 1.24 rkujawa #define BUS_SPACE_MAP_CACHEABLE 0x01 273 1.24 rkujawa #define BUS_SPACE_MAP_LINEAR 0x02 274 1.24 rkujawa #define BUS_SPACE_MAP_PREFETCHABLE 0x04 275 1.24 rkujawa 276 1.23 phx /* Instruction for enforcing reorder protection. Nothing for 68k. */ 277 1.23 phx #define amiga_bus_reorder_protect() 278 1.23 phx 279 1.24 rkujawa void * bus_space_vaddr(bus_space_tag_t space, bus_space_handle_t handle); 280 1.24 rkujawa 281 1.17 aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_1; 282 1.24 rkujawa extern const struct amiga_bus_space_methods amiga_bus_stride_1swap; 283 1.24 rkujawa extern const struct amiga_bus_space_methods amiga_bus_stride_1swap_abs; 284 1.17 aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_2; 285 1.17 aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_4; 286 1.17 aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_4swap; 287 1.17 aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_16; 288 1.29 rkujawa extern const struct amiga_bus_space_methods amiga_bus_stride_0x1000; 289 1.28 rkujawa extern const struct amiga_bus_space_methods amiga_bus_stride_0x4000; 290 1.27 rkujawa extern const struct amiga_bus_space_methods empb_bus_swap; 291 1.12 is 292 1.26 tsutsui /* 293 1.26 tsutsui * XXX 294 1.26 tsutsui * amiga doesn't have actual bus_dma(9) implementation for PCI devices yet. 295 1.26 tsutsui */ 296 1.26 tsutsui #include <m68k/bus_dma.h> 297 1.26 tsutsui 298 1.1 is #endif /* _AMIGA_BUS_H_ */ 299 1.24 rkujawa 300