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