1 1.5 rkujawa /* $NetBSD: empb_bsm.c,v 1.5 2012/06/27 18:53:03 rkujawa Exp $ */ 2 1.1 rkujawa 3 1.1 rkujawa /*- 4 1.1 rkujawa * Copyright (c) 2012 The NetBSD Foundation, Inc. 5 1.1 rkujawa * All rights reserved. 6 1.1 rkujawa * 7 1.1 rkujawa * This code is derived from software contributed to The NetBSD Foundation 8 1.1 rkujawa * by Radoslaw Kujawa. 9 1.1 rkujawa * 10 1.1 rkujawa * Redistribution and use in source and binary forms, with or without 11 1.1 rkujawa * modification, are permitted provided that the following conditions 12 1.1 rkujawa * are met: 13 1.1 rkujawa * 1. Redistributions of source code must retain the above copyright 14 1.1 rkujawa * notice, this list of conditions and the following disclaimer. 15 1.1 rkujawa * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 rkujawa * notice, this list of conditions and the following disclaimer in the 17 1.1 rkujawa * documentation and/or other materials provided with the distribution. 18 1.1 rkujawa * 19 1.1 rkujawa * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 rkujawa * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 rkujawa * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 rkujawa * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 rkujawa * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 rkujawa * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 rkujawa * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 rkujawa * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 rkujawa * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 rkujawa * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 rkujawa * POSSIBILITY OF SUCH DAMAGE. 30 1.1 rkujawa */ 31 1.1 rkujawa 32 1.1 rkujawa /* 33 1.3 rkujawa * Special bus space methods handling PCI memory window. Used only by empb. 34 1.3 rkujawa * 35 1.3 rkujawa * XXX: Handle ops on window boundary! Currently these are broken! 36 1.1 rkujawa */ 37 1.1 rkujawa 38 1.1 rkujawa #include <sys/bus.h> 39 1.1 rkujawa #include <sys/null.h> 40 1.1 rkujawa #include <sys/param.h> 41 1.1 rkujawa #include <sys/device.h> 42 1.1 rkujawa #include <sys/systm.h> 43 1.3 rkujawa #include <sys/types.h> 44 1.1 rkujawa 45 1.1 rkujawa #include <amiga/pci/empbreg.h> 46 1.1 rkujawa #include <amiga/pci/empbvar.h> 47 1.1 rkujawa #include <amiga/pci/emmemvar.h> 48 1.1 rkujawa 49 1.3 rkujawa static bool empb_bsm_init(void); 50 1.3 rkujawa 51 1.2 rkujawa /* 52 1.3 rkujawa * The bus_space functions are prototyped below. Due to macro-ridden 53 1.3 rkujawa * maddness of amiga port bus_space implementation, these prototypes look 54 1.3 rkujawa * somewhat different than what you can read in bus_space(9) man page. 55 1.3 rkujawa */ 56 1.3 rkujawa 57 1.3 rkujawa static int empb_bsm(bus_space_tag_t space, bus_addr_t address, 58 1.3 rkujawa bus_size_t size, int flags, bus_space_handle_t *handlep); 59 1.3 rkujawa static int empb_bsms(bus_space_handle_t handle, bus_size_t offset, 60 1.3 rkujawa bus_size_t size, bus_space_handle_t *nhandlep); 61 1.3 rkujawa static void empb_bsu(bus_space_handle_t handle, 62 1.3 rkujawa bus_size_t size); 63 1.3 rkujawa 64 1.3 rkujawa static bsr(empb_bsr1, u_int8_t); 65 1.3 rkujawa static bsw(empb_bsw1, u_int8_t); 66 1.3 rkujawa static bsrm(empb_bsrm1, u_int8_t); 67 1.3 rkujawa static bswm(empb_bswm1, u_int8_t); 68 1.3 rkujawa static bsrm(empb_bsrr1, u_int8_t); 69 1.3 rkujawa static bswm(empb_bswr1, u_int8_t); 70 1.3 rkujawa static bssr(empb_bssr1, u_int8_t); 71 1.3 rkujawa static bscr(empb_bscr1, u_int8_t); 72 1.3 rkujawa 73 1.3 rkujawa static bsr(empb_bsr2_swap, u_int16_t); 74 1.3 rkujawa static bsw(empb_bsw2_swap, u_int16_t); 75 1.3 rkujawa static bsr(empb_bsr2, u_int16_t); 76 1.3 rkujawa static bsw(empb_bsw2, u_int16_t); 77 1.3 rkujawa static bsrm(empb_bsrm2_swap, u_int16_t); 78 1.3 rkujawa static bswm(empb_bswm2_swap, u_int16_t); 79 1.3 rkujawa static bsrm(empb_bsrm2, u_int16_t); 80 1.3 rkujawa static bswm(empb_bswm2, u_int16_t); 81 1.3 rkujawa static bsrm(empb_bsrr2_swap, u_int16_t); 82 1.3 rkujawa static bswm(empb_bswr2_swap, u_int16_t); 83 1.3 rkujawa static bsrm(empb_bsrr2, u_int16_t); 84 1.3 rkujawa static bswm(empb_bswr2, u_int16_t); 85 1.3 rkujawa static bssr(empb_bssr2_swap, u_int16_t); 86 1.3 rkujawa static bscr(empb_bscr2, u_int16_t); 87 1.3 rkujawa 88 1.4 rkujawa static bsr(empb_bsr4_swap, u_int32_t); 89 1.3 rkujawa static bsw(empb_bsw4_swap, u_int32_t); 90 1.3 rkujawa static bsr(empb_bsr4, u_int32_t); 91 1.3 rkujawa static bsw(empb_bsw4, u_int32_t); 92 1.3 rkujawa static bsrm(empb_bsrm4_swap, u_int32_t); 93 1.3 rkujawa static bswm(empb_bswm4_swap, u_int32_t); 94 1.3 rkujawa static bsrm(empb_bsrm4, u_int32_t); 95 1.3 rkujawa static bswm(empb_bswm4, u_int32_t); 96 1.3 rkujawa static bsrm(empb_bsrr4_swap, u_int32_t); 97 1.3 rkujawa static bswm(empb_bswr4_swap, u_int32_t); 98 1.3 rkujawa static bsrm(empb_bsrr4, u_int32_t); 99 1.3 rkujawa static bswm(empb_bswr4, u_int32_t); 100 1.3 rkujawa static bssr(empb_bssr4_swap, u_int32_t); 101 1.4 rkujawa static bscr(empb_bscr4, u_int32_t); 102 1.3 rkujawa /* 103 1.3 rkujawa * Hold pointer to bridge driver here. We need to access it to switch 104 1.3 rkujawa * window position. Perhaps it should be stored in bus_space_tag instead... 105 1.3 rkujawa */ 106 1.3 rkujawa static struct empb_softc *empb_sc = NULL; 107 1.3 rkujawa 108 1.3 rkujawa static bool 109 1.3 rkujawa empb_bsm_init(void) 110 1.3 rkujawa { 111 1.3 rkujawa device_t dev; 112 1.3 rkujawa 113 1.3 rkujawa /* We can't have more than one Mediator anyway. */ 114 1.3 rkujawa if (!(dev = device_find_by_xname("empb0"))) { 115 1.3 rkujawa aprint_error("empb: can't find bridge device\n"); 116 1.3 rkujawa return false; 117 1.3 rkujawa } 118 1.3 rkujawa 119 1.3 rkujawa if (!(empb_sc = device_private(dev))) { 120 1.3 rkujawa aprint_error_dev(dev, "can't obtain bridge softc\n"); 121 1.3 rkujawa return false; 122 1.3 rkujawa } 123 1.3 rkujawa 124 1.3 rkujawa if (empb_sc->pci_mem_win_size == 0) { 125 1.3 rkujawa aprint_error_dev(dev, "no PCI memory window found\n"); 126 1.3 rkujawa return false; 127 1.3 rkujawa } 128 1.3 rkujawa 129 1.3 rkujawa return true; 130 1.3 rkujawa } 131 1.3 rkujawa 132 1.3 rkujawa /* === common bus space methods === */ 133 1.3 rkujawa 134 1.3 rkujawa static int 135 1.2 rkujawa empb_bsm(bus_space_tag_t space, bus_addr_t address, bus_size_t size, 136 1.3 rkujawa int flags, bus_space_handle_t *handlep) 137 1.3 rkujawa { 138 1.3 rkujawa 139 1.3 rkujawa /* Check for bridge driver softc. */ 140 1.3 rkujawa if (empb_sc==NULL) 141 1.3 rkujawa if(empb_bsm_init() == false) 142 1.3 rkujawa return -1; 143 1.3 rkujawa 144 1.3 rkujawa /* Fail miserably if the driver wants linear space. */ 145 1.5 rkujawa if ( (flags & BUS_SPACE_MAP_LINEAR) && (size > 8*1024*1024)) 146 1.5 rkujawa aprint_error("empb: linear space mapping might not work\n"); 147 1.3 rkujawa 148 1.3 rkujawa /* 149 1.3 rkujawa * Just store the desired PCI bus address as handlep. Don't make things 150 1.3 rkujawa * more complicated than they need to be. 151 1.3 rkujawa */ 152 1.3 rkujawa *handlep = address; 153 1.3 rkujawa 154 1.3 rkujawa return 0; 155 1.3 rkujawa } 156 1.3 rkujawa 157 1.3 rkujawa static int 158 1.3 rkujawa empb_bsms(bus_space_handle_t handle, 159 1.3 rkujawa bus_size_t offset, bus_size_t size, bus_space_handle_t *nhandlep) 160 1.3 rkujawa { 161 1.3 rkujawa *nhandlep = handle + offset; 162 1.3 rkujawa return 0; 163 1.3 rkujawa } 164 1.3 rkujawa 165 1.3 rkujawa static void 166 1.3 rkujawa empb_bsu(bus_space_handle_t handle, bus_size_t size) 167 1.3 rkujawa { 168 1.3 rkujawa return; 169 1.3 rkujawa } 170 1.3 rkujawa 171 1.3 rkujawa /* === 8-bit methods === */ 172 1.3 rkujawa 173 1.3 rkujawa static uint8_t 174 1.3 rkujawa empb_bsr1(bus_space_handle_t handle, bus_size_t offset) 175 1.3 rkujawa { 176 1.3 rkujawa uint8_t *p; 177 1.3 rkujawa uint8_t x; 178 1.3 rkujawa bus_addr_t wp; /* window position */ 179 1.3 rkujawa 180 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 181 1.3 rkujawa 182 1.3 rkujawa /* window address + (PCI mem address - window position) */ 183 1.5 rkujawa p = (uint8_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp) + offset); 184 1.3 rkujawa x = *p; 185 1.3 rkujawa 186 1.3 rkujawa return x; 187 1.3 rkujawa } 188 1.3 rkujawa 189 1.4 rkujawa static void 190 1.3 rkujawa empb_bsw1(bus_space_handle_t handle, bus_size_t offset, unsigned value) 191 1.3 rkujawa { 192 1.3 rkujawa uint8_t *p; 193 1.3 rkujawa bus_addr_t wp; 194 1.3 rkujawa 195 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 196 1.5 rkujawa p = (uint8_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp) + offset); 197 1.3 rkujawa *p = value; 198 1.3 rkujawa } 199 1.3 rkujawa 200 1.4 rkujawa static void 201 1.3 rkujawa empb_bsrm1(bus_space_handle_t handle, bus_size_t offset, u_int8_t *pointer, 202 1.3 rkujawa bus_size_t count) 203 1.3 rkujawa { 204 1.3 rkujawa volatile uint8_t *p; 205 1.3 rkujawa bus_addr_t wp; 206 1.3 rkujawa 207 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 208 1.5 rkujawa p = (volatile u_int8_t *) ((empb_sc->pci_mem_win_t->base) + 209 1.5 rkujawa (handle - wp) + offset); 210 1.3 rkujawa 211 1.3 rkujawa while (count > 0) { 212 1.3 rkujawa *pointer++ = *p; 213 1.3 rkujawa amiga_bus_reorder_protect(); 214 1.3 rkujawa --count; 215 1.3 rkujawa } 216 1.3 rkujawa } 217 1.3 rkujawa 218 1.4 rkujawa static void 219 1.3 rkujawa empb_bswm1(bus_space_handle_t handle, bus_size_t offset, 220 1.3 rkujawa const u_int8_t *pointer, bus_size_t count) 221 1.3 rkujawa { 222 1.3 rkujawa volatile uint8_t *p; 223 1.3 rkujawa bus_addr_t wp; 224 1.3 rkujawa 225 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 226 1.5 rkujawa p = (volatile u_int8_t *) ((empb_sc->pci_mem_win_t->base) + 227 1.5 rkujawa (handle - wp) + offset); 228 1.3 rkujawa 229 1.3 rkujawa while (count > 0) { 230 1.3 rkujawa *p = *pointer++; 231 1.3 rkujawa amiga_bus_reorder_protect(); 232 1.3 rkujawa --count; 233 1.3 rkujawa } 234 1.3 rkujawa } 235 1.3 rkujawa 236 1.4 rkujawa static void 237 1.3 rkujawa empb_bsrr1(bus_space_handle_t handle, bus_size_t offset, u_int8_t *pointer, 238 1.3 rkujawa bus_size_t count) 239 1.3 rkujawa { 240 1.3 rkujawa volatile uint8_t *p; 241 1.3 rkujawa bus_addr_t wp; 242 1.3 rkujawa 243 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 244 1.5 rkujawa p = (volatile u_int8_t *) ((empb_sc->pci_mem_win_t->base) + 245 1.5 rkujawa (handle - wp) + offset); 246 1.3 rkujawa 247 1.3 rkujawa while (count > 0) { 248 1.3 rkujawa *pointer++ = *p; 249 1.3 rkujawa amiga_bus_reorder_protect(); 250 1.3 rkujawa p++; 251 1.3 rkujawa --count; 252 1.3 rkujawa } 253 1.3 rkujawa } 254 1.3 rkujawa 255 1.4 rkujawa static void 256 1.3 rkujawa empb_bswr1(bus_space_handle_t handle, bus_size_t offset, 257 1.3 rkujawa const u_int8_t *pointer, bus_size_t count) 258 1.3 rkujawa { 259 1.3 rkujawa volatile uint8_t *p; 260 1.3 rkujawa bus_addr_t wp; 261 1.3 rkujawa 262 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 263 1.5 rkujawa p = (volatile u_int8_t *) ((empb_sc->pci_mem_win_t->base) + 264 1.5 rkujawa (handle - wp) + offset); 265 1.3 rkujawa 266 1.3 rkujawa while (count > 0) { 267 1.3 rkujawa *p = *pointer++; 268 1.3 rkujawa amiga_bus_reorder_protect(); 269 1.3 rkujawa p++; 270 1.3 rkujawa --count; 271 1.3 rkujawa } 272 1.3 rkujawa } 273 1.3 rkujawa 274 1.4 rkujawa static void 275 1.3 rkujawa empb_bssr1(bus_space_handle_t handle, bus_size_t offset, unsigned value, 276 1.3 rkujawa bus_size_t count) 277 1.3 rkujawa { 278 1.3 rkujawa volatile uint8_t *p; 279 1.3 rkujawa bus_addr_t wp; 280 1.3 rkujawa 281 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 282 1.5 rkujawa p = (volatile u_int8_t *) ((empb_sc->pci_mem_win_t->base) + 283 1.5 rkujawa (handle - wp) + offset); 284 1.3 rkujawa 285 1.3 rkujawa while (count > 0) { 286 1.3 rkujawa *p = value; 287 1.3 rkujawa amiga_bus_reorder_protect(); 288 1.3 rkujawa p++; 289 1.3 rkujawa --count; 290 1.3 rkujawa } 291 1.3 rkujawa } 292 1.3 rkujawa 293 1.3 rkujawa /* XXX: this is broken, rewrite */ 294 1.4 rkujawa static void 295 1.3 rkujawa empb_bscr1(bus_space_handle_t handlefrom, bus_size_t from, 296 1.3 rkujawa bus_space_handle_t handleto, bus_size_t to, bus_size_t count) 297 1.3 rkujawa { 298 1.3 rkujawa volatile uint8_t *p, *q; 299 1.3 rkujawa bus_addr_t wp; 300 1.3 rkujawa 301 1.3 rkujawa wp = empb_switch_window(empb_sc, handlefrom); 302 1.3 rkujawa 303 1.3 rkujawa p = (volatile u_int8_t *) 304 1.3 rkujawa ( ((empb_sc->pci_mem_win_t->base)+(handlefrom - wp)) + from ); 305 1.3 rkujawa q = (volatile u_int8_t *) 306 1.3 rkujawa ( ((empb_sc->pci_mem_win_t->base)+(handleto - wp)) + to ); 307 1.3 rkujawa 308 1.3 rkujawa while (count > 0) { 309 1.3 rkujawa *q = *p; 310 1.3 rkujawa amiga_bus_reorder_protect(); 311 1.3 rkujawa p ++; q++; 312 1.3 rkujawa --count; 313 1.3 rkujawa } 314 1.3 rkujawa } 315 1.3 rkujawa 316 1.3 rkujawa /* === 16-bit methods === */ 317 1.3 rkujawa 318 1.3 rkujawa static uint16_t 319 1.3 rkujawa empb_bsr2(bus_space_handle_t handle, bus_size_t offset) 320 1.3 rkujawa { 321 1.3 rkujawa uint16_t *p; 322 1.3 rkujawa uint16_t x; 323 1.3 rkujawa bus_addr_t wp; 324 1.3 rkujawa 325 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 326 1.3 rkujawa 327 1.5 rkujawa p = (uint16_t*) ((empb_sc->pci_mem_win_t->base) + (handle - wp) 328 1.5 rkujawa + offset); 329 1.3 rkujawa x = *p; 330 1.3 rkujawa 331 1.3 rkujawa return x; 332 1.3 rkujawa } 333 1.3 rkujawa 334 1.3 rkujawa static uint16_t 335 1.3 rkujawa empb_bsr2_swap(bus_space_handle_t handle, bus_size_t offset) 336 1.3 rkujawa { 337 1.3 rkujawa uint16_t *p; 338 1.3 rkujawa uint16_t x; 339 1.3 rkujawa bus_addr_t wp; 340 1.3 rkujawa 341 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 342 1.3 rkujawa 343 1.5 rkujawa p = (uint16_t*) ((empb_sc->pci_mem_win_t->base) + (handle - wp) 344 1.5 rkujawa + offset); 345 1.3 rkujawa x = *p; 346 1.3 rkujawa 347 1.3 rkujawa return bswap16(x); 348 1.3 rkujawa } 349 1.3 rkujawa 350 1.3 rkujawa 351 1.4 rkujawa static void 352 1.3 rkujawa empb_bsw2(bus_space_handle_t handle, bus_size_t offset, unsigned value) 353 1.3 rkujawa { 354 1.3 rkujawa uint16_t *p; 355 1.3 rkujawa bus_addr_t wp; 356 1.3 rkujawa 357 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 358 1.5 rkujawa p = (uint16_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp) 359 1.5 rkujawa + offset); 360 1.3 rkujawa *p = value; 361 1.3 rkujawa } 362 1.3 rkujawa 363 1.4 rkujawa static void 364 1.3 rkujawa empb_bsw2_swap(bus_space_handle_t handle, bus_size_t offset, unsigned value) 365 1.3 rkujawa { 366 1.3 rkujawa uint16_t *p; 367 1.3 rkujawa bus_addr_t wp; 368 1.3 rkujawa 369 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 370 1.5 rkujawa p = (uint16_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp) 371 1.5 rkujawa + offset); 372 1.3 rkujawa *p = bswap16(value); 373 1.3 rkujawa } 374 1.3 rkujawa 375 1.4 rkujawa static void 376 1.3 rkujawa empb_bsrm2(bus_space_handle_t handle, bus_size_t offset, u_int16_t *pointer, 377 1.3 rkujawa bus_size_t count) 378 1.3 rkujawa { 379 1.3 rkujawa volatile uint16_t *p; 380 1.3 rkujawa bus_addr_t wp; 381 1.3 rkujawa 382 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 383 1.4 rkujawa p = (volatile uint16_t *) ((empb_sc->pci_mem_win_t->base) + 384 1.5 rkujawa (handle - wp) + offset); 385 1.3 rkujawa 386 1.3 rkujawa while (count > 0) { 387 1.3 rkujawa *pointer++ = *p; 388 1.3 rkujawa amiga_bus_reorder_protect(); 389 1.3 rkujawa --count; 390 1.3 rkujawa } 391 1.3 rkujawa } 392 1.3 rkujawa 393 1.4 rkujawa static void 394 1.3 rkujawa empb_bsrm2_swap(bus_space_handle_t handle, bus_size_t offset, 395 1.3 rkujawa u_int16_t *pointer, bus_size_t count) 396 1.3 rkujawa { 397 1.3 rkujawa volatile uint16_t *p; 398 1.3 rkujawa bus_addr_t wp; 399 1.3 rkujawa 400 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 401 1.4 rkujawa p = (volatile uint16_t *) ((empb_sc->pci_mem_win_t->base) + 402 1.5 rkujawa (handle - wp) + offset); 403 1.3 rkujawa 404 1.3 rkujawa while (count > 0) { 405 1.3 rkujawa *pointer++ = bswap16(*p); 406 1.3 rkujawa amiga_bus_reorder_protect(); 407 1.3 rkujawa --count; 408 1.3 rkujawa } 409 1.3 rkujawa } 410 1.3 rkujawa 411 1.4 rkujawa static void 412 1.3 rkujawa empb_bswm2(bus_space_handle_t handle, bus_size_t offset, 413 1.3 rkujawa const u_int16_t *pointer, bus_size_t count) 414 1.3 rkujawa { 415 1.3 rkujawa volatile uint16_t *p; 416 1.3 rkujawa bus_addr_t wp; 417 1.3 rkujawa 418 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 419 1.4 rkujawa p = (volatile uint16_t *) ((empb_sc->pci_mem_win_t->base) + 420 1.5 rkujawa (handle - wp) + offset); 421 1.3 rkujawa 422 1.3 rkujawa while (count > 0) { 423 1.3 rkujawa *p = *pointer++; 424 1.3 rkujawa amiga_bus_reorder_protect(); 425 1.3 rkujawa --count; 426 1.3 rkujawa } 427 1.3 rkujawa } 428 1.3 rkujawa 429 1.4 rkujawa static void 430 1.3 rkujawa empb_bswm2_swap(bus_space_handle_t handle, bus_size_t offset, 431 1.3 rkujawa const u_int16_t *pointer, bus_size_t count) 432 1.3 rkujawa { 433 1.3 rkujawa volatile uint16_t *p; 434 1.3 rkujawa bus_addr_t wp; 435 1.3 rkujawa 436 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 437 1.4 rkujawa p = (volatile uint16_t *) ((empb_sc->pci_mem_win_t->base) + 438 1.5 rkujawa (handle - wp) + offset); 439 1.3 rkujawa 440 1.3 rkujawa while (count > 0) { 441 1.3 rkujawa *p = bswap16(*pointer++); 442 1.3 rkujawa amiga_bus_reorder_protect(); 443 1.3 rkujawa --count; 444 1.3 rkujawa } 445 1.3 rkujawa } 446 1.1 rkujawa 447 1.4 rkujawa static void 448 1.3 rkujawa empb_bsrr2(bus_space_handle_t handle, bus_size_t offset, u_int16_t *pointer, 449 1.3 rkujawa bus_size_t count) 450 1.3 rkujawa { 451 1.3 rkujawa volatile uint16_t *p; 452 1.3 rkujawa bus_addr_t wp; 453 1.3 rkujawa 454 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 455 1.5 rkujawa p = (volatile uint16_t *) ((empb_sc->pci_mem_win_t->base) + 456 1.5 rkujawa (handle - wp) + offset); 457 1.3 rkujawa 458 1.3 rkujawa while (count > 0) { 459 1.3 rkujawa *pointer++ = *p; 460 1.3 rkujawa amiga_bus_reorder_protect(); 461 1.3 rkujawa p++; 462 1.3 rkujawa --count; 463 1.3 rkujawa } 464 1.3 rkujawa } 465 1.3 rkujawa 466 1.4 rkujawa static void 467 1.3 rkujawa empb_bsrr2_swap(bus_space_handle_t handle, bus_size_t offset, 468 1.3 rkujawa u_int16_t *pointer, bus_size_t count) 469 1.3 rkujawa { 470 1.3 rkujawa volatile uint16_t *p; 471 1.3 rkujawa bus_addr_t wp; 472 1.3 rkujawa 473 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 474 1.5 rkujawa p = (volatile uint16_t *) ((empb_sc->pci_mem_win_t->base) + 475 1.5 rkujawa (handle - wp) + offset); 476 1.3 rkujawa 477 1.3 rkujawa while (count > 0) { 478 1.3 rkujawa *pointer++ = bswap16(*p); 479 1.3 rkujawa amiga_bus_reorder_protect(); 480 1.3 rkujawa p++; 481 1.3 rkujawa --count; 482 1.3 rkujawa } 483 1.3 rkujawa } 484 1.1 rkujawa 485 1.4 rkujawa static void 486 1.3 rkujawa empb_bssr2_swap(bus_space_handle_t handle, bus_size_t offset, unsigned value, 487 1.3 rkujawa bus_size_t count) 488 1.3 rkujawa { 489 1.3 rkujawa volatile uint16_t *p; 490 1.3 rkujawa bus_addr_t wp; 491 1.3 rkujawa 492 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 493 1.3 rkujawa p = (volatile uint16_t *) ((empb_sc->pci_mem_win_t->base) + 494 1.5 rkujawa (handle - wp) + offset); 495 1.3 rkujawa 496 1.3 rkujawa while (count > 0) { 497 1.3 rkujawa *p = bswap16(value); 498 1.3 rkujawa amiga_bus_reorder_protect(); 499 1.3 rkujawa p++; 500 1.3 rkujawa --count; 501 1.3 rkujawa } 502 1.3 rkujawa } 503 1.3 rkujawa 504 1.4 rkujawa static void 505 1.3 rkujawa empb_bswr2(bus_space_handle_t handle, bus_size_t offset, 506 1.3 rkujawa const u_int16_t *pointer, bus_size_t count) 507 1.3 rkujawa { 508 1.3 rkujawa volatile uint16_t *p; 509 1.3 rkujawa bus_addr_t wp; 510 1.3 rkujawa 511 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 512 1.5 rkujawa p = (volatile u_int16_t *) ((empb_sc->pci_mem_win_t->base) + 513 1.5 rkujawa (handle - wp) + offset); 514 1.3 rkujawa 515 1.3 rkujawa while (count > 0) { 516 1.3 rkujawa *p = *pointer++; 517 1.3 rkujawa amiga_bus_reorder_protect(); 518 1.3 rkujawa p++; 519 1.3 rkujawa --count; 520 1.3 rkujawa } 521 1.3 rkujawa } 522 1.3 rkujawa 523 1.4 rkujawa static void 524 1.3 rkujawa empb_bswr2_swap(bus_space_handle_t handle, bus_size_t offset, 525 1.3 rkujawa const u_int16_t *pointer, bus_size_t count) 526 1.3 rkujawa { 527 1.3 rkujawa volatile uint16_t *p; 528 1.3 rkujawa bus_addr_t wp; 529 1.3 rkujawa 530 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 531 1.5 rkujawa p = (volatile u_int16_t *) ((empb_sc->pci_mem_win_t->base) 532 1.5 rkujawa + (handle - wp) + offset); 533 1.3 rkujawa 534 1.3 rkujawa while (count > 0) { 535 1.3 rkujawa *p = bswap16(*pointer++); 536 1.3 rkujawa amiga_bus_reorder_protect(); 537 1.3 rkujawa p++; 538 1.3 rkujawa --count; 539 1.3 rkujawa } 540 1.3 rkujawa } 541 1.3 rkujawa 542 1.3 rkujawa /* XXX: this is broken, rewrite, XXX 2: should we swap here? */ 543 1.4 rkujawa static void 544 1.3 rkujawa empb_bscr2(bus_space_handle_t handlefrom, bus_size_t from, 545 1.3 rkujawa bus_space_handle_t handleto, bus_size_t to, bus_size_t count) 546 1.3 rkujawa { 547 1.3 rkujawa volatile uint16_t *p, *q; 548 1.3 rkujawa bus_addr_t wp; 549 1.3 rkujawa 550 1.3 rkujawa wp = empb_switch_window(empb_sc, handlefrom); 551 1.3 rkujawa 552 1.3 rkujawa p = (volatile uint16_t *) 553 1.3 rkujawa ( ((empb_sc->pci_mem_win_t->base)+(handlefrom - wp)) + from ); 554 1.3 rkujawa q = (volatile uint16_t *) 555 1.3 rkujawa ( ((empb_sc->pci_mem_win_t->base)+(handleto - wp)) + to ); 556 1.3 rkujawa 557 1.3 rkujawa while (count > 0) { 558 1.3 rkujawa *q = *p; 559 1.3 rkujawa amiga_bus_reorder_protect(); 560 1.3 rkujawa p++; q++; 561 1.3 rkujawa --count; 562 1.3 rkujawa } 563 1.3 rkujawa } 564 1.3 rkujawa 565 1.3 rkujawa /* === 32-bit methods === */ 566 1.4 rkujawa 567 1.3 rkujawa static uint32_t 568 1.3 rkujawa empb_bsr4(bus_space_handle_t handle, bus_size_t offset) 569 1.3 rkujawa { 570 1.3 rkujawa uint32_t *p; 571 1.3 rkujawa uint32_t x; 572 1.3 rkujawa bus_addr_t wp; 573 1.3 rkujawa 574 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 575 1.3 rkujawa 576 1.5 rkujawa p = (uint32_t*) ((empb_sc->pci_mem_win_t->base) 577 1.5 rkujawa + (handle - wp) + offset); 578 1.3 rkujawa x = *p; 579 1.3 rkujawa 580 1.3 rkujawa return x; 581 1.3 rkujawa } 582 1.3 rkujawa 583 1.3 rkujawa static uint32_t 584 1.3 rkujawa empb_bsr4_swap(bus_space_handle_t handle, bus_size_t offset) 585 1.3 rkujawa { 586 1.3 rkujawa uint32_t *p; 587 1.3 rkujawa uint32_t x; 588 1.3 rkujawa bus_addr_t wp; 589 1.3 rkujawa 590 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 591 1.3 rkujawa 592 1.5 rkujawa p = (uint32_t*) ((empb_sc->pci_mem_win_t->base) + (handle - wp) 593 1.5 rkujawa + offset); 594 1.3 rkujawa x = *p; 595 1.3 rkujawa 596 1.3 rkujawa return bswap32(x); 597 1.3 rkujawa } 598 1.3 rkujawa 599 1.3 rkujawa 600 1.4 rkujawa static void 601 1.3 rkujawa empb_bsw4(bus_space_handle_t handle, bus_size_t offset, unsigned value) 602 1.3 rkujawa { 603 1.3 rkujawa uint32_t *p; 604 1.3 rkujawa bus_addr_t wp; 605 1.3 rkujawa 606 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 607 1.5 rkujawa p = (uint32_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp) 608 1.5 rkujawa + offset); 609 1.3 rkujawa *p = value; 610 1.3 rkujawa } 611 1.3 rkujawa 612 1.4 rkujawa static void 613 1.4 rkujawa empb_bsw4_swap(bus_space_handle_t handle, bus_size_t offset, unsigned value) 614 1.3 rkujawa { 615 1.4 rkujawa uint32_t *p; 616 1.3 rkujawa bus_addr_t wp; 617 1.3 rkujawa 618 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 619 1.5 rkujawa p = (uint32_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp) 620 1.5 rkujawa + offset); 621 1.4 rkujawa *p = bswap32(value); 622 1.3 rkujawa } 623 1.3 rkujawa 624 1.4 rkujawa static void 625 1.4 rkujawa empb_bsrm4(bus_space_handle_t handle, bus_size_t offset, u_int32_t *pointer, 626 1.3 rkujawa bus_size_t count) 627 1.3 rkujawa { 628 1.4 rkujawa volatile uint32_t *p; 629 1.3 rkujawa bus_addr_t wp; 630 1.3 rkujawa 631 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 632 1.4 rkujawa p = (volatile uint32_t *) ((empb_sc->pci_mem_win_t->base) + 633 1.5 rkujawa (handle - wp) + offset); 634 1.3 rkujawa 635 1.3 rkujawa while (count > 0) { 636 1.3 rkujawa *pointer++ = *p; 637 1.3 rkujawa amiga_bus_reorder_protect(); 638 1.3 rkujawa --count; 639 1.3 rkujawa } 640 1.3 rkujawa } 641 1.3 rkujawa 642 1.4 rkujawa static void 643 1.4 rkujawa empb_bsrm4_swap(bus_space_handle_t handle, bus_size_t offset, 644 1.4 rkujawa u_int32_t *pointer, bus_size_t count) 645 1.3 rkujawa { 646 1.4 rkujawa volatile uint32_t *p; 647 1.3 rkujawa bus_addr_t wp; 648 1.3 rkujawa 649 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 650 1.4 rkujawa p = (volatile uint32_t *) ((empb_sc->pci_mem_win_t->base) + 651 1.5 rkujawa (handle - wp) + offset); 652 1.3 rkujawa 653 1.3 rkujawa while (count > 0) { 654 1.4 rkujawa *pointer++ = bswap32(*p); 655 1.3 rkujawa amiga_bus_reorder_protect(); 656 1.3 rkujawa --count; 657 1.3 rkujawa } 658 1.3 rkujawa } 659 1.3 rkujawa 660 1.4 rkujawa static void 661 1.4 rkujawa empb_bswm4(bus_space_handle_t handle, bus_size_t offset, 662 1.4 rkujawa const u_int32_t *pointer, bus_size_t count) 663 1.3 rkujawa { 664 1.4 rkujawa volatile uint32_t *p; 665 1.3 rkujawa bus_addr_t wp; 666 1.3 rkujawa 667 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 668 1.4 rkujawa p = (volatile uint32_t *) ((empb_sc->pci_mem_win_t->base) + 669 1.5 rkujawa (handle - wp) + offset); 670 1.3 rkujawa 671 1.3 rkujawa while (count > 0) { 672 1.3 rkujawa *p = *pointer++; 673 1.3 rkujawa amiga_bus_reorder_protect(); 674 1.3 rkujawa --count; 675 1.3 rkujawa } 676 1.3 rkujawa } 677 1.3 rkujawa 678 1.4 rkujawa static void 679 1.4 rkujawa empb_bswm4_swap(bus_space_handle_t handle, bus_size_t offset, 680 1.4 rkujawa const u_int32_t *pointer, bus_size_t count) 681 1.3 rkujawa { 682 1.4 rkujawa volatile uint32_t *p; 683 1.3 rkujawa bus_addr_t wp; 684 1.3 rkujawa 685 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 686 1.4 rkujawa p = (volatile uint32_t *) ((empb_sc->pci_mem_win_t->base) + 687 1.5 rkujawa (handle - wp) + offset); 688 1.3 rkujawa 689 1.3 rkujawa while (count > 0) { 690 1.4 rkujawa *p = bswap32(*pointer++); 691 1.3 rkujawa amiga_bus_reorder_protect(); 692 1.3 rkujawa --count; 693 1.3 rkujawa } 694 1.3 rkujawa } 695 1.3 rkujawa 696 1.4 rkujawa static void 697 1.4 rkujawa empb_bsrr4(bus_space_handle_t handle, bus_size_t offset, u_int32_t *pointer, 698 1.3 rkujawa bus_size_t count) 699 1.3 rkujawa { 700 1.4 rkujawa volatile uint32_t *p; 701 1.3 rkujawa bus_addr_t wp; 702 1.3 rkujawa 703 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 704 1.5 rkujawa p = (volatile uint32_t *) ((empb_sc->pci_mem_win_t->base) + 705 1.5 rkujawa (handle - wp) + offset); 706 1.3 rkujawa 707 1.3 rkujawa while (count > 0) { 708 1.3 rkujawa *pointer++ = *p; 709 1.3 rkujawa amiga_bus_reorder_protect(); 710 1.3 rkujawa p++; 711 1.3 rkujawa --count; 712 1.3 rkujawa } 713 1.3 rkujawa } 714 1.3 rkujawa 715 1.4 rkujawa static void 716 1.4 rkujawa empb_bsrr4_swap(bus_space_handle_t handle, bus_size_t offset, 717 1.4 rkujawa u_int32_t *pointer, bus_size_t count) 718 1.3 rkujawa { 719 1.4 rkujawa volatile uint32_t *p; 720 1.3 rkujawa bus_addr_t wp; 721 1.3 rkujawa 722 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 723 1.5 rkujawa p = (volatile uint32_t *) ((empb_sc->pci_mem_win_t->base) 724 1.5 rkujawa + (handle - wp) + offset); 725 1.3 rkujawa 726 1.3 rkujawa while (count > 0) { 727 1.4 rkujawa *pointer++ = bswap32(*p); 728 1.3 rkujawa amiga_bus_reorder_protect(); 729 1.3 rkujawa p++; 730 1.3 rkujawa --count; 731 1.3 rkujawa } 732 1.3 rkujawa } 733 1.3 rkujawa 734 1.4 rkujawa static void 735 1.4 rkujawa empb_bssr4_swap(bus_space_handle_t handle, bus_size_t offset, unsigned value, 736 1.3 rkujawa bus_size_t count) 737 1.3 rkujawa { 738 1.4 rkujawa volatile uint32_t *p; 739 1.3 rkujawa bus_addr_t wp; 740 1.3 rkujawa 741 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 742 1.4 rkujawa p = (volatile uint32_t *) ((empb_sc->pci_mem_win_t->base) + 743 1.5 rkujawa (handle - wp) + offset); 744 1.3 rkujawa 745 1.3 rkujawa while (count > 0) { 746 1.4 rkujawa *p = bswap32(value); 747 1.3 rkujawa amiga_bus_reorder_protect(); 748 1.3 rkujawa p++; 749 1.3 rkujawa --count; 750 1.3 rkujawa } 751 1.3 rkujawa } 752 1.3 rkujawa 753 1.4 rkujawa static void 754 1.4 rkujawa empb_bswr4(bus_space_handle_t handle, bus_size_t offset, 755 1.4 rkujawa const u_int32_t *pointer, bus_size_t count) 756 1.3 rkujawa { 757 1.4 rkujawa volatile uint32_t *p; 758 1.3 rkujawa bus_addr_t wp; 759 1.3 rkujawa 760 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 761 1.5 rkujawa p = (volatile uint32_t *) ((empb_sc->pci_mem_win_t->base) 762 1.5 rkujawa + (handle - wp) + offset); 763 1.3 rkujawa 764 1.3 rkujawa while (count > 0) { 765 1.3 rkujawa *p = *pointer++; 766 1.3 rkujawa amiga_bus_reorder_protect(); 767 1.3 rkujawa p++; 768 1.3 rkujawa --count; 769 1.3 rkujawa } 770 1.3 rkujawa } 771 1.3 rkujawa 772 1.4 rkujawa static void 773 1.4 rkujawa empb_bswr4_swap(bus_space_handle_t handle, bus_size_t offset, 774 1.4 rkujawa const u_int32_t *pointer, bus_size_t count) 775 1.3 rkujawa { 776 1.4 rkujawa volatile uint32_t *p; 777 1.3 rkujawa bus_addr_t wp; 778 1.3 rkujawa 779 1.3 rkujawa wp = empb_switch_window(empb_sc, handle); 780 1.5 rkujawa p = (volatile uint32_t *) ((empb_sc->pci_mem_win_t->base) 781 1.5 rkujawa + (handle - wp) + offset); 782 1.3 rkujawa 783 1.3 rkujawa while (count > 0) { 784 1.4 rkujawa *p = bswap32(*pointer++); 785 1.3 rkujawa amiga_bus_reorder_protect(); 786 1.3 rkujawa p++; 787 1.3 rkujawa --count; 788 1.3 rkujawa } 789 1.3 rkujawa } 790 1.3 rkujawa 791 1.4 rkujawa /* XXX: this is broken, rewrite, XXX 2: should we swap here? */ 792 1.3 rkujawa void 793 1.4 rkujawa empb_bscr4(bus_space_handle_t handlefrom, bus_size_t from, 794 1.3 rkujawa bus_space_handle_t handleto, bus_size_t to, bus_size_t count) 795 1.3 rkujawa { 796 1.4 rkujawa volatile uint32_t *p, *q; 797 1.3 rkujawa bus_addr_t wp; 798 1.3 rkujawa 799 1.3 rkujawa wp = empb_switch_window(empb_sc, handlefrom); 800 1.3 rkujawa 801 1.4 rkujawa p = (volatile uint32_t *) 802 1.3 rkujawa ( ((empb_sc->pci_mem_win_t->base)+(handlefrom - wp)) + from ); 803 1.4 rkujawa q = (volatile uint32_t *) 804 1.3 rkujawa ( ((empb_sc->pci_mem_win_t->base)+(handleto - wp)) + to ); 805 1.3 rkujawa 806 1.3 rkujawa while (count > 0) { 807 1.3 rkujawa *q = *p; 808 1.3 rkujawa amiga_bus_reorder_protect(); 809 1.3 rkujawa p++; q++; 810 1.3 rkujawa --count; 811 1.3 rkujawa } 812 1.4 rkujawa } 813 1.3 rkujawa /* === end of implementation === */ 814 1.1 rkujawa 815 1.1 rkujawa const struct amiga_bus_space_methods empb_bus_swap = { 816 1.2 rkujawa 817 1.2 rkujawa .bsm = empb_bsm, 818 1.1 rkujawa .bsms = empb_bsms, 819 1.1 rkujawa .bsu = empb_bsu, 820 1.1 rkujawa .bsa = NULL, 821 1.1 rkujawa .bsf = NULL, 822 1.1 rkujawa 823 1.3 rkujawa /* 8-bit methods */ 824 1.1 rkujawa .bsr1 = empb_bsr1, 825 1.1 rkujawa .bsw1 = empb_bsw1, 826 1.1 rkujawa .bsrm1 = empb_bsrm1, 827 1.1 rkujawa .bswm1 = empb_bswm1, 828 1.1 rkujawa .bsrr1 = empb_bsrr1, 829 1.1 rkujawa .bswr1 = empb_bswr1, 830 1.1 rkujawa .bssr1 = empb_bssr1, 831 1.1 rkujawa .bscr1 = empb_bscr1, 832 1.1 rkujawa 833 1.3 rkujawa /* 16-bit methods */ 834 1.2 rkujawa .bsr2 = empb_bsr2_swap, 835 1.2 rkujawa .bsw2 = empb_bsw2_swap, 836 1.2 rkujawa .bsrs2 = empb_bsr2, 837 1.2 rkujawa .bsws2 = empb_bsw2, 838 1.2 rkujawa .bsrm2 = empb_bsrm2_swap, 839 1.2 rkujawa .bswm2 = empb_bswm2_swap, 840 1.2 rkujawa .bsrms2 = empb_bsrm2, 841 1.2 rkujawa .bswms2 = empb_bswm2, 842 1.2 rkujawa .bsrr2 = empb_bsrr2_swap, 843 1.2 rkujawa .bswr2 = empb_bswr2_swap, 844 1.2 rkujawa .bsrrs2 = empb_bsrr2, 845 1.2 rkujawa .bswrs2 = empb_bswr2, 846 1.2 rkujawa .bssr2 = empb_bssr2_swap, 847 1.4 rkujawa .bscr2 = empb_bscr2, /* swap? */ 848 1.2 rkujawa 849 1.4 rkujawa /* 32-bit methods */ 850 1.2 rkujawa .bsr4 = empb_bsr4_swap, 851 1.2 rkujawa .bsw4 = empb_bsw4_swap, 852 1.2 rkujawa .bsrs4 = empb_bsr4, 853 1.2 rkujawa .bsws4 = empb_bsw4, 854 1.2 rkujawa .bsrm4 = empb_bsrm4_swap, 855 1.2 rkujawa .bswm4 = empb_bswm4_swap, 856 1.2 rkujawa .bsrms4 = empb_bsrm4, 857 1.2 rkujawa .bswms4 = empb_bswm4, 858 1.2 rkujawa .bsrr4 = empb_bsrr4_swap, 859 1.2 rkujawa .bswr4 = empb_bswr4_swap, 860 1.2 rkujawa .bsrrs4 = empb_bsrr4, 861 1.2 rkujawa .bswrs4 = empb_bswr4, 862 1.2 rkujawa .bssr4 = empb_bssr4_swap, 863 1.5 rkujawa .bscr4 = empb_bscr4 /* swap? */ 864 1.5 rkujawa 865 1.1 rkujawa }; 866 1.3 rkujawa 867 1.1 rkujawa 868