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