empb_bsm.c revision 1.3 1 1.3 rkujawa /* $NetBSD: empb_bsm.c,v 1.3 2012/06/04 12:56:48 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.3 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.3 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.3 rkujawa if (flags & BUS_SPACE_MAP_LINEAR)
146 1.3 rkujawa {
147 1.3 rkujawa aprint_error("empb: linear space mapping not possible\n");
148 1.3 rkujawa return -1;
149 1.3 rkujawa }
150 1.3 rkujawa
151 1.3 rkujawa /*
152 1.3 rkujawa * Just store the desired PCI bus address as handlep. Don't make things
153 1.3 rkujawa * more complicated than they need to be.
154 1.3 rkujawa */
155 1.3 rkujawa *handlep = address;
156 1.3 rkujawa
157 1.3 rkujawa return 0;
158 1.3 rkujawa }
159 1.3 rkujawa
160 1.3 rkujawa static int
161 1.3 rkujawa empb_bsms(bus_space_handle_t handle,
162 1.3 rkujawa bus_size_t offset, bus_size_t size, bus_space_handle_t *nhandlep)
163 1.3 rkujawa {
164 1.3 rkujawa *nhandlep = handle + offset;
165 1.3 rkujawa return 0;
166 1.3 rkujawa }
167 1.3 rkujawa
168 1.3 rkujawa static void
169 1.3 rkujawa empb_bsu(bus_space_handle_t handle, bus_size_t size)
170 1.3 rkujawa {
171 1.3 rkujawa return;
172 1.3 rkujawa }
173 1.3 rkujawa
174 1.3 rkujawa /* === 8-bit methods === */
175 1.3 rkujawa
176 1.3 rkujawa static uint8_t
177 1.3 rkujawa empb_bsr1(bus_space_handle_t handle, bus_size_t offset)
178 1.3 rkujawa {
179 1.3 rkujawa uint8_t *p;
180 1.3 rkujawa uint8_t x;
181 1.3 rkujawa bus_addr_t wp; /* window position */
182 1.3 rkujawa
183 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
184 1.3 rkujawa
185 1.3 rkujawa /* window address + (PCI mem address - window position) */
186 1.3 rkujawa p = (uint8_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp));
187 1.3 rkujawa x = *p;
188 1.3 rkujawa
189 1.3 rkujawa return x;
190 1.3 rkujawa }
191 1.3 rkujawa
192 1.3 rkujawa void
193 1.3 rkujawa empb_bsw1(bus_space_handle_t handle, bus_size_t offset, unsigned value)
194 1.3 rkujawa {
195 1.3 rkujawa uint8_t *p;
196 1.3 rkujawa bus_addr_t wp;
197 1.3 rkujawa
198 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
199 1.3 rkujawa p = (uint8_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp));
200 1.3 rkujawa *p = value;
201 1.3 rkujawa }
202 1.3 rkujawa
203 1.3 rkujawa void
204 1.3 rkujawa empb_bsrm1(bus_space_handle_t handle, bus_size_t offset, u_int8_t *pointer,
205 1.3 rkujawa bus_size_t count)
206 1.3 rkujawa {
207 1.3 rkujawa volatile uint8_t *p;
208 1.3 rkujawa bus_addr_t wp;
209 1.3 rkujawa
210 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
211 1.3 rkujawa p = (volatile u_int8_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
212 1.3 rkujawa
213 1.3 rkujawa while (count > 0) {
214 1.3 rkujawa *pointer++ = *p;
215 1.3 rkujawa amiga_bus_reorder_protect();
216 1.3 rkujawa --count;
217 1.3 rkujawa }
218 1.3 rkujawa }
219 1.3 rkujawa
220 1.3 rkujawa void
221 1.3 rkujawa empb_bswm1(bus_space_handle_t handle, bus_size_t offset,
222 1.3 rkujawa const u_int8_t *pointer, bus_size_t count)
223 1.3 rkujawa {
224 1.3 rkujawa volatile uint8_t *p;
225 1.3 rkujawa bus_addr_t wp;
226 1.3 rkujawa
227 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
228 1.3 rkujawa p = (volatile u_int8_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
229 1.3 rkujawa
230 1.3 rkujawa while (count > 0) {
231 1.3 rkujawa *p = *pointer++;
232 1.3 rkujawa amiga_bus_reorder_protect();
233 1.3 rkujawa --count;
234 1.3 rkujawa }
235 1.3 rkujawa }
236 1.3 rkujawa
237 1.3 rkujawa void
238 1.3 rkujawa empb_bsrr1(bus_space_handle_t handle, bus_size_t offset, u_int8_t *pointer,
239 1.3 rkujawa bus_size_t count)
240 1.3 rkujawa {
241 1.3 rkujawa volatile uint8_t *p;
242 1.3 rkujawa bus_addr_t wp;
243 1.3 rkujawa
244 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
245 1.3 rkujawa p = (volatile u_int8_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
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.3 rkujawa 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.3 rkujawa p = (volatile u_int8_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
264 1.3 rkujawa
265 1.3 rkujawa while (count > 0) {
266 1.3 rkujawa *p = *pointer++;
267 1.3 rkujawa amiga_bus_reorder_protect();
268 1.3 rkujawa p++;
269 1.3 rkujawa --count;
270 1.3 rkujawa }
271 1.3 rkujawa }
272 1.3 rkujawa
273 1.3 rkujawa void
274 1.3 rkujawa empb_bssr1(bus_space_handle_t handle, bus_size_t offset, unsigned value,
275 1.3 rkujawa bus_size_t count)
276 1.3 rkujawa {
277 1.3 rkujawa volatile uint8_t *p;
278 1.3 rkujawa bus_addr_t wp;
279 1.3 rkujawa
280 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
281 1.3 rkujawa p = (volatile u_int8_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
282 1.3 rkujawa
283 1.3 rkujawa while (count > 0) {
284 1.3 rkujawa *p = value;
285 1.3 rkujawa amiga_bus_reorder_protect();
286 1.3 rkujawa p++;
287 1.3 rkujawa --count;
288 1.3 rkujawa }
289 1.3 rkujawa }
290 1.3 rkujawa
291 1.3 rkujawa /* XXX: this is broken, rewrite */
292 1.3 rkujawa void
293 1.3 rkujawa empb_bscr1(bus_space_handle_t handlefrom, bus_size_t from,
294 1.3 rkujawa bus_space_handle_t handleto, bus_size_t to, bus_size_t count)
295 1.3 rkujawa {
296 1.3 rkujawa volatile uint8_t *p, *q;
297 1.3 rkujawa bus_addr_t wp;
298 1.3 rkujawa
299 1.3 rkujawa wp = empb_switch_window(empb_sc, handlefrom);
300 1.3 rkujawa
301 1.3 rkujawa p = (volatile u_int8_t *)
302 1.3 rkujawa ( ((empb_sc->pci_mem_win_t->base)+(handlefrom - wp)) + from );
303 1.3 rkujawa q = (volatile u_int8_t *)
304 1.3 rkujawa ( ((empb_sc->pci_mem_win_t->base)+(handleto - wp)) + to );
305 1.3 rkujawa
306 1.3 rkujawa while (count > 0) {
307 1.3 rkujawa *q = *p;
308 1.3 rkujawa amiga_bus_reorder_protect();
309 1.3 rkujawa p ++; q++;
310 1.3 rkujawa --count;
311 1.3 rkujawa }
312 1.3 rkujawa }
313 1.3 rkujawa
314 1.3 rkujawa /* === 16-bit methods === */
315 1.3 rkujawa
316 1.3 rkujawa static uint16_t
317 1.3 rkujawa empb_bsr2(bus_space_handle_t handle, bus_size_t offset)
318 1.3 rkujawa {
319 1.3 rkujawa uint16_t *p;
320 1.3 rkujawa uint16_t x;
321 1.3 rkujawa bus_addr_t wp;
322 1.3 rkujawa
323 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
324 1.3 rkujawa
325 1.3 rkujawa p = (uint16_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp));
326 1.3 rkujawa x = *p;
327 1.3 rkujawa
328 1.3 rkujawa return x;
329 1.3 rkujawa }
330 1.3 rkujawa
331 1.3 rkujawa static uint16_t
332 1.3 rkujawa empb_bsr2_swap(bus_space_handle_t handle, bus_size_t offset)
333 1.3 rkujawa {
334 1.3 rkujawa uint16_t *p;
335 1.3 rkujawa uint16_t x;
336 1.3 rkujawa bus_addr_t wp;
337 1.3 rkujawa
338 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
339 1.3 rkujawa
340 1.3 rkujawa p = (uint16_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp));
341 1.3 rkujawa x = *p;
342 1.3 rkujawa
343 1.3 rkujawa return bswap16(x);
344 1.3 rkujawa }
345 1.3 rkujawa
346 1.3 rkujawa
347 1.3 rkujawa void
348 1.3 rkujawa empb_bsw2(bus_space_handle_t handle, bus_size_t offset, unsigned value)
349 1.3 rkujawa {
350 1.3 rkujawa uint16_t *p;
351 1.3 rkujawa bus_addr_t wp;
352 1.3 rkujawa
353 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
354 1.3 rkujawa p = (uint16_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp));
355 1.3 rkujawa *p = value;
356 1.3 rkujawa }
357 1.3 rkujawa
358 1.3 rkujawa void
359 1.3 rkujawa empb_bsw2_swap(bus_space_handle_t handle, bus_size_t offset, unsigned value)
360 1.3 rkujawa {
361 1.3 rkujawa uint16_t *p;
362 1.3 rkujawa bus_addr_t wp;
363 1.3 rkujawa
364 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
365 1.3 rkujawa p = (uint16_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp));
366 1.3 rkujawa *p = bswap16(value);
367 1.3 rkujawa }
368 1.3 rkujawa
369 1.3 rkujawa void
370 1.3 rkujawa empb_bsrm2(bus_space_handle_t handle, bus_size_t offset, u_int16_t *pointer,
371 1.3 rkujawa bus_size_t count)
372 1.3 rkujawa {
373 1.3 rkujawa volatile uint16_t *p;
374 1.3 rkujawa bus_addr_t wp;
375 1.3 rkujawa
376 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
377 1.3 rkujawa p = (volatile u_int16_t *) ((empb_sc->pci_mem_win_t->base) +
378 1.3 rkujawa (handle - wp));
379 1.3 rkujawa
380 1.3 rkujawa while (count > 0) {
381 1.3 rkujawa *pointer++ = *p;
382 1.3 rkujawa amiga_bus_reorder_protect();
383 1.3 rkujawa --count;
384 1.3 rkujawa }
385 1.3 rkujawa }
386 1.3 rkujawa
387 1.3 rkujawa void
388 1.3 rkujawa empb_bsrm2_swap(bus_space_handle_t handle, bus_size_t offset,
389 1.3 rkujawa u_int16_t *pointer, bus_size_t count)
390 1.3 rkujawa {
391 1.3 rkujawa volatile uint16_t *p;
392 1.3 rkujawa bus_addr_t wp;
393 1.3 rkujawa
394 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
395 1.3 rkujawa p = (volatile u_int16_t *) ((empb_sc->pci_mem_win_t->base) +
396 1.3 rkujawa (handle - wp));
397 1.3 rkujawa
398 1.3 rkujawa while (count > 0) {
399 1.3 rkujawa *pointer++ = bswap16(*p);
400 1.3 rkujawa amiga_bus_reorder_protect();
401 1.3 rkujawa --count;
402 1.3 rkujawa }
403 1.3 rkujawa }
404 1.3 rkujawa
405 1.3 rkujawa void
406 1.3 rkujawa empb_bswm2(bus_space_handle_t handle, bus_size_t offset,
407 1.3 rkujawa const u_int16_t *pointer, bus_size_t count)
408 1.3 rkujawa {
409 1.3 rkujawa volatile uint16_t *p;
410 1.3 rkujawa bus_addr_t wp;
411 1.3 rkujawa
412 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
413 1.3 rkujawa p = (volatile u_int16_t *) ((empb_sc->pci_mem_win_t->base) +
414 1.3 rkujawa (handle - wp));
415 1.3 rkujawa
416 1.3 rkujawa while (count > 0) {
417 1.3 rkujawa *p = *pointer++;
418 1.3 rkujawa amiga_bus_reorder_protect();
419 1.3 rkujawa --count;
420 1.3 rkujawa }
421 1.3 rkujawa }
422 1.3 rkujawa
423 1.3 rkujawa void
424 1.3 rkujawa empb_bswm2_swap(bus_space_handle_t handle, bus_size_t offset,
425 1.3 rkujawa const u_int16_t *pointer, bus_size_t count)
426 1.3 rkujawa {
427 1.3 rkujawa volatile uint16_t *p;
428 1.3 rkujawa bus_addr_t wp;
429 1.3 rkujawa
430 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
431 1.3 rkujawa p = (volatile u_int16_t *) ((empb_sc->pci_mem_win_t->base) +
432 1.3 rkujawa (handle - wp));
433 1.3 rkujawa
434 1.3 rkujawa while (count > 0) {
435 1.3 rkujawa *p = bswap16(*pointer++);
436 1.3 rkujawa amiga_bus_reorder_protect();
437 1.3 rkujawa --count;
438 1.3 rkujawa }
439 1.3 rkujawa }
440 1.1 rkujawa
441 1.3 rkujawa void
442 1.3 rkujawa empb_bsrr2(bus_space_handle_t handle, bus_size_t offset, u_int16_t *pointer,
443 1.3 rkujawa bus_size_t count)
444 1.3 rkujawa {
445 1.3 rkujawa volatile uint16_t *p;
446 1.3 rkujawa bus_addr_t wp;
447 1.3 rkujawa
448 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
449 1.3 rkujawa p = (volatile uint16_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
450 1.3 rkujawa
451 1.3 rkujawa while (count > 0) {
452 1.3 rkujawa *pointer++ = *p;
453 1.3 rkujawa amiga_bus_reorder_protect();
454 1.3 rkujawa p++;
455 1.3 rkujawa --count;
456 1.3 rkujawa }
457 1.3 rkujawa }
458 1.3 rkujawa
459 1.3 rkujawa void
460 1.3 rkujawa empb_bsrr2_swap(bus_space_handle_t handle, bus_size_t offset,
461 1.3 rkujawa u_int16_t *pointer, bus_size_t count)
462 1.3 rkujawa {
463 1.3 rkujawa volatile uint16_t *p;
464 1.3 rkujawa bus_addr_t wp;
465 1.3 rkujawa
466 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
467 1.3 rkujawa p = (volatile uint16_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
468 1.3 rkujawa
469 1.3 rkujawa while (count > 0) {
470 1.3 rkujawa *pointer++ = bswap16(*p);
471 1.3 rkujawa amiga_bus_reorder_protect();
472 1.3 rkujawa p++;
473 1.3 rkujawa --count;
474 1.3 rkujawa }
475 1.3 rkujawa }
476 1.1 rkujawa
477 1.3 rkujawa void
478 1.3 rkujawa empb_bssr2_swap(bus_space_handle_t handle, bus_size_t offset, unsigned value,
479 1.3 rkujawa bus_size_t count)
480 1.3 rkujawa {
481 1.3 rkujawa volatile uint16_t *p;
482 1.3 rkujawa bus_addr_t wp;
483 1.3 rkujawa
484 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
485 1.3 rkujawa p = (volatile uint16_t *) ((empb_sc->pci_mem_win_t->base) +
486 1.3 rkujawa (handle - wp));
487 1.3 rkujawa
488 1.3 rkujawa while (count > 0) {
489 1.3 rkujawa *p = bswap16(value);
490 1.3 rkujawa amiga_bus_reorder_protect();
491 1.3 rkujawa p++;
492 1.3 rkujawa --count;
493 1.3 rkujawa }
494 1.3 rkujawa }
495 1.3 rkujawa
496 1.3 rkujawa void
497 1.3 rkujawa empb_bswr2(bus_space_handle_t handle, bus_size_t offset,
498 1.3 rkujawa const u_int16_t *pointer, bus_size_t count)
499 1.3 rkujawa {
500 1.3 rkujawa volatile uint16_t *p;
501 1.3 rkujawa bus_addr_t wp;
502 1.3 rkujawa
503 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
504 1.3 rkujawa p = (volatile u_int16_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
505 1.3 rkujawa
506 1.3 rkujawa while (count > 0) {
507 1.3 rkujawa *p = *pointer++;
508 1.3 rkujawa amiga_bus_reorder_protect();
509 1.3 rkujawa p++;
510 1.3 rkujawa --count;
511 1.3 rkujawa }
512 1.3 rkujawa }
513 1.3 rkujawa
514 1.3 rkujawa void
515 1.3 rkujawa empb_bswr2_swap(bus_space_handle_t handle, bus_size_t offset,
516 1.3 rkujawa const u_int16_t *pointer, bus_size_t count)
517 1.3 rkujawa {
518 1.3 rkujawa volatile uint16_t *p;
519 1.3 rkujawa bus_addr_t wp;
520 1.3 rkujawa
521 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
522 1.3 rkujawa p = (volatile u_int16_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
523 1.3 rkujawa
524 1.3 rkujawa while (count > 0) {
525 1.3 rkujawa *p = bswap16(*pointer++);
526 1.3 rkujawa amiga_bus_reorder_protect();
527 1.3 rkujawa p++;
528 1.3 rkujawa --count;
529 1.3 rkujawa }
530 1.3 rkujawa }
531 1.3 rkujawa
532 1.3 rkujawa /* XXX: this is broken, rewrite, XXX 2: should we swap here? */
533 1.3 rkujawa void
534 1.3 rkujawa empb_bscr2(bus_space_handle_t handlefrom, bus_size_t from,
535 1.3 rkujawa bus_space_handle_t handleto, bus_size_t to, bus_size_t count)
536 1.3 rkujawa {
537 1.3 rkujawa volatile uint16_t *p, *q;
538 1.3 rkujawa bus_addr_t wp;
539 1.3 rkujawa
540 1.3 rkujawa wp = empb_switch_window(empb_sc, handlefrom);
541 1.3 rkujawa
542 1.3 rkujawa p = (volatile uint16_t *)
543 1.3 rkujawa ( ((empb_sc->pci_mem_win_t->base)+(handlefrom - wp)) + from );
544 1.3 rkujawa q = (volatile uint16_t *)
545 1.3 rkujawa ( ((empb_sc->pci_mem_win_t->base)+(handleto - wp)) + to );
546 1.3 rkujawa
547 1.3 rkujawa while (count > 0) {
548 1.3 rkujawa *q = *p;
549 1.3 rkujawa amiga_bus_reorder_protect();
550 1.3 rkujawa p++; q++;
551 1.3 rkujawa --count;
552 1.3 rkujawa }
553 1.3 rkujawa }
554 1.3 rkujawa
555 1.3 rkujawa /* === 32-bit methods === */
556 1.3 rkujawa /*
557 1.3 rkujawa static uint32_t
558 1.3 rkujawa empb_bsr4(bus_space_handle_t handle, bus_size_t offset)
559 1.3 rkujawa {
560 1.3 rkujawa uint32_t *p;
561 1.3 rkujawa uint32_t x;
562 1.3 rkujawa bus_addr_t wp;
563 1.3 rkujawa
564 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
565 1.3 rkujawa
566 1.3 rkujawa p = (uint32_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp));
567 1.3 rkujawa x = *p;
568 1.3 rkujawa
569 1.3 rkujawa return x;
570 1.3 rkujawa }
571 1.3 rkujawa
572 1.3 rkujawa static uint32_t
573 1.3 rkujawa empb_bsr4_swap(bus_space_handle_t handle, bus_size_t offset)
574 1.3 rkujawa {
575 1.3 rkujawa uint32_t *p;
576 1.3 rkujawa uint32_t x;
577 1.3 rkujawa bus_addr_t wp;
578 1.3 rkujawa
579 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
580 1.3 rkujawa
581 1.3 rkujawa p = (uint32_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp));
582 1.3 rkujawa x = *p;
583 1.3 rkujawa
584 1.3 rkujawa return bswap32(x);
585 1.3 rkujawa }
586 1.3 rkujawa
587 1.3 rkujawa
588 1.3 rkujawa void
589 1.3 rkujawa empb_bsw4(bus_space_handle_t handle, bus_size_t offset, unsigned value)
590 1.3 rkujawa {
591 1.3 rkujawa uint32_t *p;
592 1.3 rkujawa bus_addr_t wp;
593 1.3 rkujawa
594 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
595 1.3 rkujawa p = (uint16_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp));
596 1.3 rkujawa *p = value;
597 1.3 rkujawa }
598 1.3 rkujawa
599 1.3 rkujawa void
600 1.3 rkujawa empb_bsw2_swap(bus_space_handle_t handle, bus_size_t offset, unsigned value)
601 1.3 rkujawa {
602 1.3 rkujawa uint16_t *p;
603 1.3 rkujawa bus_addr_t wp;
604 1.3 rkujawa
605 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
606 1.3 rkujawa p = (uint16_t*)((empb_sc->pci_mem_win_t->base) + (handle - wp));
607 1.3 rkujawa *p = bswap16(value);
608 1.3 rkujawa }
609 1.3 rkujawa
610 1.3 rkujawa void
611 1.3 rkujawa empb_bsrm2(bus_space_handle_t handle, bus_size_t offset, u_int16_t *pointer,
612 1.3 rkujawa bus_size_t count)
613 1.3 rkujawa {
614 1.3 rkujawa volatile uint16_t *p;
615 1.3 rkujawa bus_addr_t wp;
616 1.3 rkujawa
617 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
618 1.3 rkujawa p = (volatile u_int16_t *) ((empb_sc->pci_mem_win_t->base) +
619 1.3 rkujawa (handle - wp));
620 1.3 rkujawa
621 1.3 rkujawa while (count > 0) {
622 1.3 rkujawa *pointer++ = *p;
623 1.3 rkujawa amiga_bus_reorder_protect();
624 1.3 rkujawa --count;
625 1.3 rkujawa }
626 1.3 rkujawa }
627 1.3 rkujawa
628 1.3 rkujawa void
629 1.3 rkujawa empb_bsrm2_swap(bus_space_handle_t handle, bus_size_t offset,
630 1.3 rkujawa u_int16_t *pointer, bus_size_t count)
631 1.3 rkujawa {
632 1.3 rkujawa volatile uint16_t *p;
633 1.3 rkujawa bus_addr_t wp;
634 1.3 rkujawa
635 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
636 1.3 rkujawa p = (volatile u_int16_t *) ((empb_sc->pci_mem_win_t->base) +
637 1.3 rkujawa (handle - wp));
638 1.3 rkujawa
639 1.3 rkujawa while (count > 0) {
640 1.3 rkujawa *pointer++ = bswap16(*p);
641 1.3 rkujawa amiga_bus_reorder_protect();
642 1.3 rkujawa --count;
643 1.3 rkujawa }
644 1.3 rkujawa }
645 1.3 rkujawa
646 1.3 rkujawa void
647 1.3 rkujawa empb_bswm2(bus_space_handle_t handle, bus_size_t offset,
648 1.3 rkujawa const u_int16_t *pointer, bus_size_t count)
649 1.3 rkujawa {
650 1.3 rkujawa volatile uint16_t *p;
651 1.3 rkujawa bus_addr_t wp;
652 1.3 rkujawa
653 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
654 1.3 rkujawa p = (volatile u_int16_t *) ((empb_sc->pci_mem_win_t->base) +
655 1.3 rkujawa (handle - wp));
656 1.3 rkujawa
657 1.3 rkujawa while (count > 0) {
658 1.3 rkujawa *p = *pointer++;
659 1.3 rkujawa amiga_bus_reorder_protect();
660 1.3 rkujawa --count;
661 1.3 rkujawa }
662 1.3 rkujawa }
663 1.3 rkujawa
664 1.3 rkujawa void
665 1.3 rkujawa empb_bswm2_swap(bus_space_handle_t handle, bus_size_t offset,
666 1.3 rkujawa const u_int16_t *pointer, bus_size_t count)
667 1.3 rkujawa {
668 1.3 rkujawa volatile uint16_t *p;
669 1.3 rkujawa bus_addr_t wp;
670 1.3 rkujawa
671 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
672 1.3 rkujawa p = (volatile u_int16_t *) ((empb_sc->pci_mem_win_t->base) +
673 1.3 rkujawa (handle - wp));
674 1.3 rkujawa
675 1.3 rkujawa while (count > 0) {
676 1.3 rkujawa *p = bswap16(*pointer++);
677 1.3 rkujawa amiga_bus_reorder_protect();
678 1.3 rkujawa --count;
679 1.3 rkujawa }
680 1.3 rkujawa }
681 1.3 rkujawa
682 1.3 rkujawa void
683 1.3 rkujawa empb_bsrr2(bus_space_handle_t handle, bus_size_t offset, u_int16_t *pointer,
684 1.3 rkujawa bus_size_t count)
685 1.3 rkujawa {
686 1.3 rkujawa volatile uint16_t *p;
687 1.3 rkujawa bus_addr_t wp;
688 1.3 rkujawa
689 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
690 1.3 rkujawa p = (volatile uint16_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
691 1.3 rkujawa
692 1.3 rkujawa while (count > 0) {
693 1.3 rkujawa *pointer++ = *p;
694 1.3 rkujawa amiga_bus_reorder_protect();
695 1.3 rkujawa p++;
696 1.3 rkujawa --count;
697 1.3 rkujawa }
698 1.3 rkujawa }
699 1.3 rkujawa
700 1.3 rkujawa void
701 1.3 rkujawa empb_bsrr2_swap(bus_space_handle_t handle, bus_size_t offset,
702 1.3 rkujawa u_int16_t *pointer, bus_size_t count)
703 1.3 rkujawa {
704 1.3 rkujawa volatile uint16_t *p;
705 1.3 rkujawa bus_addr_t wp;
706 1.3 rkujawa
707 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
708 1.3 rkujawa p = (volatile uint16_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
709 1.3 rkujawa
710 1.3 rkujawa while (count > 0) {
711 1.3 rkujawa *pointer++ = bswap16(*p);
712 1.3 rkujawa amiga_bus_reorder_protect();
713 1.3 rkujawa p++;
714 1.3 rkujawa --count;
715 1.3 rkujawa }
716 1.3 rkujawa }
717 1.3 rkujawa
718 1.3 rkujawa void
719 1.3 rkujawa empb_bssr2_swap(bus_space_handle_t handle, bus_size_t offset, unsigned value,
720 1.3 rkujawa bus_size_t count)
721 1.3 rkujawa {
722 1.3 rkujawa volatile uint16_t *p;
723 1.3 rkujawa bus_addr_t wp;
724 1.3 rkujawa
725 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
726 1.3 rkujawa p = (volatile uint16_t *) ((empb_sc->pci_mem_win_t->base) +
727 1.3 rkujawa (handle - wp));
728 1.3 rkujawa
729 1.3 rkujawa while (count > 0) {
730 1.3 rkujawa *p = bswap16(value);
731 1.3 rkujawa amiga_bus_reorder_protect();
732 1.3 rkujawa p++;
733 1.3 rkujawa --count;
734 1.3 rkujawa }
735 1.3 rkujawa }
736 1.3 rkujawa
737 1.3 rkujawa void
738 1.3 rkujawa empb_bswr2(bus_space_handle_t handle, bus_size_t offset,
739 1.3 rkujawa const u_int16_t *pointer, bus_size_t count)
740 1.3 rkujawa {
741 1.3 rkujawa volatile uint16_t *p;
742 1.3 rkujawa bus_addr_t wp;
743 1.3 rkujawa
744 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
745 1.3 rkujawa p = (volatile u_int16_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
746 1.3 rkujawa
747 1.3 rkujawa while (count > 0) {
748 1.3 rkujawa *p = *pointer++;
749 1.3 rkujawa amiga_bus_reorder_protect();
750 1.3 rkujawa p++;
751 1.3 rkujawa --count;
752 1.3 rkujawa }
753 1.3 rkujawa }
754 1.3 rkujawa
755 1.3 rkujawa void
756 1.3 rkujawa empb_bswr2_swap(bus_space_handle_t handle, bus_size_t offset,
757 1.3 rkujawa const u_int16_t *pointer, bus_size_t count)
758 1.3 rkujawa {
759 1.3 rkujawa volatile uint16_t *p;
760 1.3 rkujawa bus_addr_t wp;
761 1.3 rkujawa
762 1.3 rkujawa wp = empb_switch_window(empb_sc, handle);
763 1.3 rkujawa p = (volatile u_int16_t *)((empb_sc->pci_mem_win_t->base)+(handle - wp));
764 1.3 rkujawa
765 1.3 rkujawa while (count > 0) {
766 1.3 rkujawa *p = bswap16(*pointer++);
767 1.3 rkujawa amiga_bus_reorder_protect();
768 1.3 rkujawa p++;
769 1.3 rkujawa --count;
770 1.3 rkujawa }
771 1.3 rkujawa }
772 1.3 rkujawa
773 1.3 rkujawa // XXX: this is broken, rewrite, XXX 2: should we swap here?
774 1.3 rkujawa void
775 1.3 rkujawa empb_bscr2(bus_space_handle_t handlefrom, bus_size_t from,
776 1.3 rkujawa bus_space_handle_t handleto, bus_size_t to, bus_size_t count)
777 1.3 rkujawa {
778 1.3 rkujawa volatile uint16_t *p, *q;
779 1.3 rkujawa bus_addr_t wp;
780 1.3 rkujawa
781 1.3 rkujawa wp = empb_switch_window(empb_sc, handlefrom);
782 1.3 rkujawa
783 1.3 rkujawa p = (volatile uint16_t *)
784 1.3 rkujawa ( ((empb_sc->pci_mem_win_t->base)+(handlefrom - wp)) + from );
785 1.3 rkujawa q = (volatile uint16_t *)
786 1.3 rkujawa ( ((empb_sc->pci_mem_win_t->base)+(handleto - wp)) + to );
787 1.3 rkujawa
788 1.3 rkujawa while (count > 0) {
789 1.3 rkujawa *q = *p;
790 1.3 rkujawa amiga_bus_reorder_protect();
791 1.3 rkujawa p++; q++;
792 1.3 rkujawa --count;
793 1.3 rkujawa }
794 1.3 rkujawa } */
795 1.3 rkujawa /* === end of implementation === */
796 1.1 rkujawa
797 1.1 rkujawa const struct amiga_bus_space_methods empb_bus_swap = {
798 1.2 rkujawa
799 1.2 rkujawa .bsm = empb_bsm,
800 1.1 rkujawa .bsms = empb_bsms,
801 1.1 rkujawa .bsu = empb_bsu,
802 1.1 rkujawa .bsa = NULL,
803 1.1 rkujawa .bsf = NULL,
804 1.1 rkujawa
805 1.3 rkujawa /* 8-bit methods */
806 1.1 rkujawa .bsr1 = empb_bsr1,
807 1.1 rkujawa .bsw1 = empb_bsw1,
808 1.1 rkujawa .bsrm1 = empb_bsrm1,
809 1.1 rkujawa .bswm1 = empb_bswm1,
810 1.1 rkujawa .bsrr1 = empb_bsrr1,
811 1.1 rkujawa .bswr1 = empb_bswr1,
812 1.1 rkujawa .bssr1 = empb_bssr1,
813 1.1 rkujawa .bscr1 = empb_bscr1,
814 1.1 rkujawa
815 1.3 rkujawa /* 16-bit methods */
816 1.2 rkujawa .bsr2 = empb_bsr2_swap,
817 1.2 rkujawa .bsw2 = empb_bsw2_swap,
818 1.2 rkujawa .bsrs2 = empb_bsr2,
819 1.2 rkujawa .bsws2 = empb_bsw2,
820 1.2 rkujawa .bsrm2 = empb_bsrm2_swap,
821 1.2 rkujawa .bswm2 = empb_bswm2_swap,
822 1.2 rkujawa .bsrms2 = empb_bsrm2,
823 1.2 rkujawa .bswms2 = empb_bswm2,
824 1.2 rkujawa .bsrr2 = empb_bsrr2_swap,
825 1.2 rkujawa .bswr2 = empb_bswr2_swap,
826 1.2 rkujawa .bsrrs2 = empb_bsrr2,
827 1.2 rkujawa .bswrs2 = empb_bswr2,
828 1.2 rkujawa .bssr2 = empb_bssr2_swap,
829 1.3 rkujawa .bscr2 = empb_bscr2 /*
830 1.2 rkujawa
831 1.3 rkujawa //32-bit methods
832 1.2 rkujawa .bsr4 = empb_bsr4_swap,
833 1.2 rkujawa .bsw4 = empb_bsw4_swap,
834 1.2 rkujawa .bsrs4 = empb_bsr4,
835 1.2 rkujawa .bsws4 = empb_bsw4,
836 1.2 rkujawa .bsrm4 = empb_bsrm4_swap,
837 1.2 rkujawa .bswm4 = empb_bswm4_swap,
838 1.2 rkujawa .bsrms4 = empb_bsrm4,
839 1.2 rkujawa .bswms4 = empb_bswm4,
840 1.2 rkujawa .bsrr4 = empb_bsrr4_swap,
841 1.2 rkujawa .bswr4 = empb_bswr4_swap,
842 1.2 rkujawa .bsrrs4 = empb_bsrr4,
843 1.2 rkujawa .bswrs4 = empb_bswr4,
844 1.2 rkujawa .bssr4 = empb_bssr4_swap,
845 1.3 rkujawa .bscr4 = empb_bscr4_swap */
846 1.1 rkujawa };
847 1.3 rkujawa
848 1.1 rkujawa
849