1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2006 Semihalf, Rafal Jaworowski <[email protected]>
5 * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to The NetBSD Foundation
9 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
10 * NASA Ames Research Center.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 #include <sys/cdefs.h>
35 #define KTR_BE_IO 0
36 #define KTR_LE_IO 0
37
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/bus.h>
41 #include <sys/ktr.h>
42 #include <vm/vm.h>
43 #include <vm/pmap.h>
44 #include <sys/endian.h>
45
46 #include <machine/bus.h>
47 #include <machine/pio.h>
48 #include <machine/md_var.h>
49
50 #define TODO panic("%s: not implemented", __func__)
51
52 #define MAX_EARLYBOOT_MAPPINGS 6
53
54 static struct {
55 vm_offset_t virt;
56 bus_addr_t addr;
57 bus_size_t size;
58 int flags;
59 } earlyboot_mappings[MAX_EARLYBOOT_MAPPINGS];
60 static int earlyboot_map_idx = 0;
61
62 void bs_remap_earlyboot(void);
63
64 static __inline void *
__ppc_ba(bus_space_handle_t bsh,bus_size_t ofs)65 __ppc_ba(bus_space_handle_t bsh, bus_size_t ofs)
66 {
67 return ((void *)(bsh + ofs));
68 }
69
70 static int
bs_gen_map(bus_addr_t addr,bus_size_t size,int flags,bus_space_handle_t * bshp)71 bs_gen_map(bus_addr_t addr, bus_size_t size, int flags,
72 bus_space_handle_t *bshp)
73 {
74 vm_memattr_t ma;
75
76 /*
77 * Record what we did if we haven't enabled the MMU yet. We
78 * will need to remap it as soon as the MMU comes up.
79 */
80 if (!pmap_bootstrapped) {
81 KASSERT(earlyboot_map_idx < MAX_EARLYBOOT_MAPPINGS,
82 ("%s: too many early boot mapping requests", __func__));
83 earlyboot_mappings[earlyboot_map_idx].addr = addr;
84 earlyboot_mappings[earlyboot_map_idx].virt =
85 pmap_early_io_map(addr, size);
86 earlyboot_mappings[earlyboot_map_idx].size = size;
87 earlyboot_mappings[earlyboot_map_idx].flags = flags;
88 *bshp = earlyboot_mappings[earlyboot_map_idx].virt;
89 earlyboot_map_idx++;
90 } else {
91 ma = VM_MEMATTR_DEFAULT;
92 switch (flags) {
93 case BUS_SPACE_MAP_CACHEABLE:
94 ma = VM_MEMATTR_CACHEABLE;
95 break;
96 case BUS_SPACE_MAP_PREFETCHABLE:
97 ma = VM_MEMATTR_PREFETCHABLE;
98 break;
99 }
100 *bshp = (bus_space_handle_t)pmap_mapdev_attr(addr, size, ma);
101 }
102
103 return (0);
104 }
105
106 void
bs_remap_earlyboot(void)107 bs_remap_earlyboot(void)
108 {
109 vm_paddr_t pa, spa;
110 vm_offset_t va;
111 int i;
112 vm_memattr_t ma;
113
114 for (i = 0; i < earlyboot_map_idx; i++) {
115 spa = earlyboot_mappings[i].addr;
116
117 if (hw_direct_map &&
118 PHYS_TO_DMAP(spa) == earlyboot_mappings[i].virt &&
119 pmap_dev_direct_mapped(spa, earlyboot_mappings[i].size) == 0)
120 continue;
121
122 ma = VM_MEMATTR_DEFAULT;
123 switch (earlyboot_mappings[i].flags) {
124 case BUS_SPACE_MAP_CACHEABLE:
125 ma = VM_MEMATTR_CACHEABLE;
126 break;
127 case BUS_SPACE_MAP_PREFETCHABLE:
128 ma = VM_MEMATTR_PREFETCHABLE;
129 break;
130 }
131
132 pa = trunc_page(spa);
133 va = trunc_page(earlyboot_mappings[i].virt);
134 while (pa < spa + earlyboot_mappings[i].size) {
135 pmap_kenter_attr(va, pa, ma);
136 va += PAGE_SIZE;
137 pa += PAGE_SIZE;
138 }
139 }
140 }
141
142 static void
bs_gen_unmap(bus_size_t size __unused)143 bs_gen_unmap(bus_size_t size __unused)
144 {
145 }
146
147 static int
bs_gen_subregion(bus_space_handle_t bsh,bus_size_t ofs,bus_size_t size __unused,bus_space_handle_t * nbshp)148 bs_gen_subregion(bus_space_handle_t bsh, bus_size_t ofs,
149 bus_size_t size __unused, bus_space_handle_t *nbshp)
150 {
151 *nbshp = bsh + ofs;
152 return (0);
153 }
154
155 static int
bs_gen_alloc(bus_addr_t rstart __unused,bus_addr_t rend __unused,bus_size_t size __unused,bus_size_t alignment __unused,bus_size_t boundary __unused,int flags __unused,bus_addr_t * bpap __unused,bus_space_handle_t * bshp __unused)156 bs_gen_alloc(bus_addr_t rstart __unused, bus_addr_t rend __unused,
157 bus_size_t size __unused, bus_size_t alignment __unused,
158 bus_size_t boundary __unused, int flags __unused,
159 bus_addr_t *bpap __unused, bus_space_handle_t *bshp __unused)
160 {
161 TODO;
162 }
163
164 static void
bs_gen_free(bus_space_handle_t bsh __unused,bus_size_t size __unused)165 bs_gen_free(bus_space_handle_t bsh __unused, bus_size_t size __unused)
166 {
167 TODO;
168 }
169
170 static void
bs_gen_barrier(bus_space_handle_t bsh __unused,bus_size_t ofs __unused,bus_size_t size __unused,int flags __unused)171 bs_gen_barrier(bus_space_handle_t bsh __unused, bus_size_t ofs __unused,
172 bus_size_t size __unused, int flags __unused)
173 {
174
175 powerpc_iomb();
176 }
177
178 /*
179 * Native-endian access functions
180 */
181 static uint8_t
native_bs_rs_1(bus_space_handle_t bsh,bus_size_t ofs)182 native_bs_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
183 {
184 volatile uint8_t *addr;
185 uint8_t res;
186
187 addr = __ppc_ba(bsh, ofs);
188 res = *addr;
189 powerpc_iomb();
190 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
191 return (res);
192 }
193
194 static uint16_t
native_bs_rs_2(bus_space_handle_t bsh,bus_size_t ofs)195 native_bs_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
196 {
197 volatile uint16_t *addr;
198 uint16_t res;
199
200 addr = __ppc_ba(bsh, ofs);
201 res = *addr;
202 powerpc_iomb();
203 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
204 return (res);
205 }
206
207 static uint32_t
native_bs_rs_4(bus_space_handle_t bsh,bus_size_t ofs)208 native_bs_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
209 {
210 volatile uint32_t *addr;
211 uint32_t res;
212
213 addr = __ppc_ba(bsh, ofs);
214 res = *addr;
215 powerpc_iomb();
216 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
217 return (res);
218 }
219
220 static uint64_t
native_bs_rs_8(bus_space_handle_t bsh,bus_size_t ofs)221 native_bs_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
222 {
223 volatile uint64_t *addr;
224 uint64_t res;
225
226 addr = __ppc_ba(bsh, ofs);
227 res = *addr;
228 powerpc_iomb();
229 return (res);
230 }
231
232 static void
native_bs_rm_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t * addr,size_t cnt)233 native_bs_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
234 {
235 ins8(__ppc_ba(bsh, ofs), addr, cnt);
236 }
237
238 static void
native_bs_rm_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t * addr,size_t cnt)239 native_bs_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
240 {
241 ins16(__ppc_ba(bsh, ofs), addr, cnt);
242 }
243
244 static void
native_bs_rm_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t * addr,size_t cnt)245 native_bs_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
246 {
247 ins32(__ppc_ba(bsh, ofs), addr, cnt);
248 }
249
250 static void
native_bs_rm_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t * addr,size_t cnt)251 native_bs_rm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
252 {
253 ins64(__ppc_ba(bsh, ofs), addr, cnt);
254 }
255
256 static void
native_bs_rr_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t * addr,size_t cnt)257 native_bs_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
258 {
259 volatile uint8_t *s = __ppc_ba(bsh, ofs);
260
261 while (cnt--)
262 *addr++ = *s++;
263 powerpc_iomb();
264 }
265
266 static void
native_bs_rr_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t * addr,size_t cnt)267 native_bs_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
268 {
269 volatile uint16_t *s = __ppc_ba(bsh, ofs);
270
271 while (cnt--)
272 *addr++ = *s++;
273 powerpc_iomb();
274 }
275
276 static void
native_bs_rr_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t * addr,size_t cnt)277 native_bs_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
278 {
279 volatile uint32_t *s = __ppc_ba(bsh, ofs);
280
281 while (cnt--)
282 *addr++ = *s++;
283 powerpc_iomb();
284 }
285
286 static void
native_bs_rr_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t * addr,size_t cnt)287 native_bs_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
288 {
289 volatile uint64_t *s = __ppc_ba(bsh, ofs);
290
291 while (cnt--)
292 *addr++ = *s++;
293 powerpc_iomb();
294 }
295
296 static void
native_bs_ws_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val)297 native_bs_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
298 {
299 volatile uint8_t *addr;
300
301 addr = __ppc_ba(bsh, ofs);
302 *addr = val;
303 powerpc_iomb();
304 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
305 }
306
307 static void
native_bs_ws_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val)308 native_bs_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
309 {
310 volatile uint16_t *addr;
311
312 addr = __ppc_ba(bsh, ofs);
313 *addr = val;
314 powerpc_iomb();
315 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
316 }
317
318 static void
native_bs_ws_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val)319 native_bs_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
320 {
321 volatile uint32_t *addr;
322
323 addr = __ppc_ba(bsh, ofs);
324 *addr = val;
325 powerpc_iomb();
326 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
327 }
328
329 static void
native_bs_ws_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val)330 native_bs_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
331 {
332 volatile uint64_t *addr;
333
334 addr = __ppc_ba(bsh, ofs);
335 *addr = val;
336 powerpc_iomb();
337 CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
338 }
339
340 static void
native_bs_wm_1(bus_space_handle_t bsh,bus_size_t ofs,const uint8_t * addr,bus_size_t cnt)341 native_bs_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
342 bus_size_t cnt)
343 {
344 outsb(__ppc_ba(bsh, ofs), addr, cnt);
345 }
346
347 static void
native_bs_wm_2(bus_space_handle_t bsh,bus_size_t ofs,const uint16_t * addr,bus_size_t cnt)348 native_bs_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
349 bus_size_t cnt)
350 {
351 outsw(__ppc_ba(bsh, ofs), addr, cnt);
352 }
353
354 static void
native_bs_wm_4(bus_space_handle_t bsh,bus_size_t ofs,const uint32_t * addr,bus_size_t cnt)355 native_bs_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
356 bus_size_t cnt)
357 {
358 outsl(__ppc_ba(bsh, ofs), addr, cnt);
359 }
360
361 static void
native_bs_wm_8(bus_space_handle_t bsh,bus_size_t ofs,const uint64_t * addr,bus_size_t cnt)362 native_bs_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
363 bus_size_t cnt)
364 {
365 outsll(__ppc_ba(bsh, ofs), addr, cnt);
366 }
367
368 static void
native_bs_wr_1(bus_space_handle_t bsh,bus_size_t ofs,const uint8_t * addr,size_t cnt)369 native_bs_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
370 size_t cnt)
371 {
372 volatile uint8_t *d = __ppc_ba(bsh, ofs);
373
374 while (cnt--)
375 *d++ = *addr++;
376 powerpc_iomb();
377 }
378
379 static void
native_bs_wr_2(bus_space_handle_t bsh,bus_size_t ofs,const uint16_t * addr,size_t cnt)380 native_bs_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
381 size_t cnt)
382 {
383 volatile uint16_t *d = __ppc_ba(bsh, ofs);
384
385 while (cnt--)
386 *d++ = *addr++;
387 powerpc_iomb();
388 }
389
390 static void
native_bs_wr_4(bus_space_handle_t bsh,bus_size_t ofs,const uint32_t * addr,size_t cnt)391 native_bs_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
392 size_t cnt)
393 {
394 volatile uint32_t *d = __ppc_ba(bsh, ofs);
395
396 while (cnt--)
397 *d++ = *addr++;
398 powerpc_iomb();
399 }
400
401 static void
native_bs_wr_8(bus_space_handle_t bsh,bus_size_t ofs,const uint64_t * addr,size_t cnt)402 native_bs_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
403 size_t cnt)
404 {
405 volatile uint64_t *d = __ppc_ba(bsh, ofs);
406
407 while (cnt--)
408 *d++ = *addr++;
409 powerpc_iomb();
410 }
411
412 static void
native_bs_sm_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val,size_t cnt)413 native_bs_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
414 {
415 volatile uint8_t *d = __ppc_ba(bsh, ofs);
416
417 while (cnt--)
418 *d = val;
419 powerpc_iomb();
420 }
421
422 static void
native_bs_sm_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val,size_t cnt)423 native_bs_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
424 {
425 volatile uint16_t *d = __ppc_ba(bsh, ofs);
426
427 while (cnt--)
428 *d = val;
429 powerpc_iomb();
430 }
431
432 static void
native_bs_sm_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val,size_t cnt)433 native_bs_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
434 {
435 volatile uint32_t *d = __ppc_ba(bsh, ofs);
436
437 while (cnt--)
438 *d = val;
439 powerpc_iomb();
440 }
441
442 static void
native_bs_sm_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val,size_t cnt)443 native_bs_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
444 {
445 volatile uint64_t *d = __ppc_ba(bsh, ofs);
446
447 while (cnt--)
448 *d = val;
449 powerpc_iomb();
450 }
451
452 static void
native_bs_sr_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val,size_t cnt)453 native_bs_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
454 {
455 volatile uint8_t *d = __ppc_ba(bsh, ofs);
456
457 while (cnt--)
458 *d++ = val;
459 powerpc_iomb();
460 }
461
462 static void
native_bs_sr_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val,size_t cnt)463 native_bs_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
464 {
465 volatile uint16_t *d = __ppc_ba(bsh, ofs);
466
467 while (cnt--)
468 *d++ = val;
469 powerpc_iomb();
470 }
471
472 static void
native_bs_sr_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val,size_t cnt)473 native_bs_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
474 {
475 volatile uint32_t *d = __ppc_ba(bsh, ofs);
476
477 while (cnt--)
478 *d++ = val;
479 powerpc_iomb();
480 }
481
482 static void
native_bs_sr_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val,size_t cnt)483 native_bs_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
484 {
485 volatile uint64_t *d = __ppc_ba(bsh, ofs);
486
487 while (cnt--)
488 *d++ = val;
489 powerpc_iomb();
490 }
491
492 /*
493 * Byteswapped access functions
494 */
495 static uint8_t
swapped_bs_rs_1(bus_space_handle_t bsh,bus_size_t ofs)496 swapped_bs_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
497 {
498 volatile uint8_t *addr;
499 uint8_t res;
500
501 addr = __ppc_ba(bsh, ofs);
502 res = *addr;
503 powerpc_iomb();
504 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
505 return (res);
506 }
507
508 static uint16_t
swapped_bs_rs_2(bus_space_handle_t bsh,bus_size_t ofs)509 swapped_bs_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
510 {
511 volatile uint16_t *addr;
512 uint16_t res;
513
514 addr = __ppc_ba(bsh, ofs);
515 __asm __volatile("lhbrx %0, 0, %1" : "=r"(res) : "r"(addr));
516 powerpc_iomb();
517 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
518 return (res);
519 }
520
521 static uint32_t
swapped_bs_rs_4(bus_space_handle_t bsh,bus_size_t ofs)522 swapped_bs_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
523 {
524 volatile uint32_t *addr;
525 uint32_t res;
526
527 addr = __ppc_ba(bsh, ofs);
528 __asm __volatile("lwbrx %0, 0, %1" : "=r"(res) : "r"(addr));
529 powerpc_iomb();
530 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
531 return (res);
532 }
533
534 static uint64_t
swapped_bs_rs_8(bus_space_handle_t bsh,bus_size_t ofs)535 swapped_bs_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
536 {
537 volatile uint64_t *addr;
538 uint64_t res;
539
540 addr = __ppc_ba(bsh, ofs);
541 res = le64toh(*addr);
542 powerpc_iomb();
543 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
544 return (res);
545 }
546
547 static void
swapped_bs_rm_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t * addr,size_t cnt)548 swapped_bs_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
549 {
550 ins8(__ppc_ba(bsh, ofs), addr, cnt);
551 }
552
553 static void
swapped_bs_rm_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t * addr,size_t cnt)554 swapped_bs_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
555 {
556 ins16rb(__ppc_ba(bsh, ofs), addr, cnt);
557 }
558
559 static void
swapped_bs_rm_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t * addr,size_t cnt)560 swapped_bs_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
561 {
562 ins32rb(__ppc_ba(bsh, ofs), addr, cnt);
563 }
564
565 static void
swapped_bs_rm_8(bus_space_handle_t bshh,bus_size_t ofs,uint64_t * addr,size_t cnt)566 swapped_bs_rm_8(bus_space_handle_t bshh, bus_size_t ofs, uint64_t *addr, size_t cnt)
567 {
568 TODO;
569 }
570
571 static void
swapped_bs_rr_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t * addr,size_t cnt)572 swapped_bs_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
573 {
574 volatile uint8_t *s = __ppc_ba(bsh, ofs);
575
576 while (cnt--)
577 *addr++ = *s++;
578 powerpc_iomb();
579 }
580
581 static void
swapped_bs_rr_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t * addr,size_t cnt)582 swapped_bs_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
583 {
584 volatile uint16_t *s = __ppc_ba(bsh, ofs);
585
586 while (cnt--)
587 *addr++ = in16rb(s++);
588 powerpc_iomb();
589 }
590
591 static void
swapped_bs_rr_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t * addr,size_t cnt)592 swapped_bs_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
593 {
594 volatile uint32_t *s = __ppc_ba(bsh, ofs);
595
596 while (cnt--)
597 *addr++ = in32rb(s++);
598 powerpc_iomb();
599 }
600
601 static void
swapped_bs_rr_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t * addr,size_t cnt)602 swapped_bs_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
603 {
604 TODO;
605 }
606
607 static void
swapped_bs_ws_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val)608 swapped_bs_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
609 {
610 volatile uint8_t *addr;
611
612 addr = __ppc_ba(bsh, ofs);
613 *addr = val;
614 powerpc_iomb();
615 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
616 }
617
618 static void
swapped_bs_ws_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val)619 swapped_bs_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
620 {
621 volatile uint16_t *addr;
622
623 addr = __ppc_ba(bsh, ofs);
624 __asm __volatile("sthbrx %0, 0, %1" :: "r"(val), "r"(addr));
625 powerpc_iomb();
626 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
627 }
628
629 static void
swapped_bs_ws_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val)630 swapped_bs_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
631 {
632 volatile uint32_t *addr;
633
634 addr = __ppc_ba(bsh, ofs);
635 __asm __volatile("stwbrx %0, 0, %1" :: "r"(val), "r"(addr));
636 powerpc_iomb();
637 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
638 }
639
640 static void
swapped_bs_ws_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val)641 swapped_bs_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
642 {
643 volatile uint64_t *addr;
644
645 addr = __ppc_ba(bsh, ofs);
646 *addr = htole64(val);
647 powerpc_iomb();
648 CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
649 }
650
651 static void
swapped_bs_wm_1(bus_space_handle_t bsh,bus_size_t ofs,const uint8_t * addr,bus_size_t cnt)652 swapped_bs_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
653 bus_size_t cnt)
654 {
655 outs8(__ppc_ba(bsh, ofs), addr, cnt);
656 }
657
658 static void
swapped_bs_wm_2(bus_space_handle_t bsh,bus_size_t ofs,const uint16_t * addr,bus_size_t cnt)659 swapped_bs_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
660 bus_size_t cnt)
661 {
662 outs16rb(__ppc_ba(bsh, ofs), addr, cnt);
663 }
664
665 static void
swapped_bs_wm_4(bus_space_handle_t bsh,bus_size_t ofs,const uint32_t * addr,bus_size_t cnt)666 swapped_bs_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
667 bus_size_t cnt)
668 {
669 outs32rb(__ppc_ba(bsh, ofs), addr, cnt);
670 }
671
672 static void
swapped_bs_wm_8(bus_space_handle_t bsh,bus_size_t ofs,const uint64_t * addr,bus_size_t cnt)673 swapped_bs_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
674 bus_size_t cnt)
675 {
676 TODO;
677 }
678
679 static void
swapped_bs_wr_1(bus_space_handle_t bsh,bus_size_t ofs,const uint8_t * addr,size_t cnt)680 swapped_bs_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
681 size_t cnt)
682 {
683 volatile uint8_t *d = __ppc_ba(bsh, ofs);
684
685 while (cnt--)
686 *d++ = *addr++;
687 powerpc_iomb();
688 }
689
690 static void
swapped_bs_wr_2(bus_space_handle_t bsh,bus_size_t ofs,const uint16_t * addr,size_t cnt)691 swapped_bs_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
692 size_t cnt)
693 {
694 volatile uint16_t *d = __ppc_ba(bsh, ofs);
695
696 while (cnt--)
697 out16rb(d++, *addr++);
698 powerpc_iomb();
699 }
700
701 static void
swapped_bs_wr_4(bus_space_handle_t bsh,bus_size_t ofs,const uint32_t * addr,size_t cnt)702 swapped_bs_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
703 size_t cnt)
704 {
705 volatile uint32_t *d = __ppc_ba(bsh, ofs);
706
707 while (cnt--)
708 out32rb(d++, *addr++);
709 powerpc_iomb();
710 }
711
712 static void
swapped_bs_wr_8(bus_space_handle_t bsh,bus_size_t ofs,const uint64_t * addr,size_t cnt)713 swapped_bs_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
714 size_t cnt)
715 {
716 TODO;
717 }
718
719 static void
swapped_bs_sm_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val,size_t cnt)720 swapped_bs_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
721 {
722 volatile uint8_t *d = __ppc_ba(bsh, ofs);
723
724 while (cnt--)
725 *d = val;
726 powerpc_iomb();
727 }
728
729 static void
swapped_bs_sm_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val,size_t cnt)730 swapped_bs_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
731 {
732 volatile uint16_t *d = __ppc_ba(bsh, ofs);
733
734 while (cnt--)
735 out16rb(d, val);
736 powerpc_iomb();
737 }
738
739 static void
swapped_bs_sm_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val,size_t cnt)740 swapped_bs_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
741 {
742 volatile uint32_t *d = __ppc_ba(bsh, ofs);
743
744 while (cnt--)
745 out32rb(d, val);
746 powerpc_iomb();
747 }
748
749 static void
swapped_bs_sm_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val,size_t cnt)750 swapped_bs_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
751 {
752 TODO;
753 }
754
755 static void
swapped_bs_sr_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val,size_t cnt)756 swapped_bs_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
757 {
758 volatile uint8_t *d = __ppc_ba(bsh, ofs);
759
760 while (cnt--)
761 *d++ = val;
762 powerpc_iomb();
763 }
764
765 static void
swapped_bs_sr_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val,size_t cnt)766 swapped_bs_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
767 {
768 volatile uint16_t *d = __ppc_ba(bsh, ofs);
769
770 while (cnt--)
771 out16rb(d++, val);
772 powerpc_iomb();
773 }
774
775 static void
swapped_bs_sr_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val,size_t cnt)776 swapped_bs_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
777 {
778 volatile uint32_t *d = __ppc_ba(bsh, ofs);
779
780 while (cnt--)
781 out32rb(d++, val);
782 powerpc_iomb();
783 }
784
785 static void
swapped_bs_sr_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val,size_t cnt)786 swapped_bs_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
787 {
788 TODO;
789 }
790
791 #if BYTE_ORDER == LITTLE_ENDIAN
792 struct bus_space bs_le_tag = {
793 #else
794 struct bus_space bs_be_tag = {
795 #endif
796 /* mapping/unmapping */
797 .bs_map = bs_gen_map,
798 .bs_unmap = bs_gen_unmap,
799 .bs_subregion = bs_gen_subregion,
800
801 /* allocation/deallocation */
802 .bs_alloc = bs_gen_alloc,
803 .bs_free = bs_gen_free,
804
805 /* barrier */
806 .bs_barrier = bs_gen_barrier,
807
808 /* read (single) */
809 .bs_r_1 = native_bs_rs_1,
810 .bs_r_2 = native_bs_rs_2,
811 .bs_r_4 = native_bs_rs_4,
812 .bs_r_8 = native_bs_rs_8,
813
814 /* read (single) stream */
815 .bs_r_s_2 = native_bs_rs_2,
816 .bs_r_s_4 = native_bs_rs_4,
817 .bs_r_s_8 = native_bs_rs_8,
818
819 /* read multiple */
820 .bs_rm_1 = native_bs_rm_1,
821 .bs_rm_2 = native_bs_rm_2,
822 .bs_rm_4 = native_bs_rm_4,
823 .bs_rm_8 = native_bs_rm_8,
824
825 /* read multiple stream */
826 .bs_rm_s_2 = native_bs_rm_2,
827 .bs_rm_s_4 = native_bs_rm_4,
828 .bs_rm_s_8 = native_bs_rm_8,
829
830 /* read region */
831 .bs_rr_1 = native_bs_rr_1,
832 .bs_rr_2 = native_bs_rr_2,
833 .bs_rr_4 = native_bs_rr_4,
834 .bs_rr_8 = native_bs_rr_8,
835
836 /* read region stream */
837 .bs_rr_s_2 = native_bs_rr_2,
838 .bs_rr_s_4 = native_bs_rr_4,
839 .bs_rr_s_8 = native_bs_rr_8,
840
841 /* write (single) */
842 .bs_w_1 = native_bs_ws_1,
843 .bs_w_2 = native_bs_ws_2,
844 .bs_w_4 = native_bs_ws_4,
845 .bs_w_8 = native_bs_ws_8,
846
847 /* write (single) stream */
848 .bs_w_s_2 = native_bs_ws_2,
849 .bs_w_s_4 = native_bs_ws_4,
850 .bs_w_s_8 = native_bs_ws_8,
851
852 /* write multiple */
853 .bs_wm_1 = native_bs_wm_1,
854 .bs_wm_2 = native_bs_wm_2,
855 .bs_wm_4 = native_bs_wm_4,
856 .bs_wm_8 = native_bs_wm_8,
857
858 /* write multiple stream */
859 .bs_wm_s_2 = native_bs_wm_2,
860 .bs_wm_s_4 = native_bs_wm_4,
861 .bs_wm_s_8 = native_bs_wm_8,
862
863 /* write region */
864 .bs_wr_1 = native_bs_wr_1,
865 .bs_wr_2 = native_bs_wr_2,
866 .bs_wr_4 = native_bs_wr_4,
867 .bs_wr_8 = native_bs_wr_8,
868
869 /* write region stream */
870 .bs_wr_s_2 = native_bs_wr_2,
871 .bs_wr_s_4 = native_bs_wr_4,
872 .bs_wr_s_8 = native_bs_wr_8,
873
874 /* set multiple */
875 .bs_sm_1 = native_bs_sm_1,
876 .bs_sm_2 = native_bs_sm_2,
877 .bs_sm_4 = native_bs_sm_4,
878 .bs_sm_8 = native_bs_sm_8,
879
880 /* set multiple stream */
881 .bs_sm_s_2 = native_bs_sm_2,
882 .bs_sm_s_4 = native_bs_sm_4,
883 .bs_sm_s_8 = native_bs_sm_8,
884
885 /* set region */
886 .bs_sr_1 = native_bs_sr_1,
887 .bs_sr_2 = native_bs_sr_2,
888 .bs_sr_4 = native_bs_sr_4,
889 .bs_sr_8 = native_bs_sr_8,
890
891 /* set region stream */
892 .bs_sr_s_2 = native_bs_sr_2,
893 .bs_sr_s_4 = native_bs_sr_4,
894 .bs_sr_s_8 = native_bs_sr_8,
895
896 /* copy region */
897 .bs_cr_1 = NULL, /* UNIMPLEMENTED */
898 .bs_cr_2 = NULL, /* UNIMPLEMENTED */
899 .bs_cr_4 = NULL, /* UNIMPLEMENTED */
900 .bs_cr_8 = NULL, /* UNIMPLEMENTED */
901
902 /* copy region stream */
903 .bs_cr_s_2 = NULL, /* UNIMPLEMENTED */
904 .bs_cr_s_4 = NULL, /* UNIMPLEMENTED */
905 .bs_cr_s_8 = NULL, /* UNIMPLEMENTED */
906 };
907
908 #if BYTE_ORDER == LITTLE_ENDIAN
909 struct bus_space bs_be_tag = {
910 #else
911 struct bus_space bs_le_tag = {
912 #endif
913 /* mapping/unmapping */
914 .bs_map = bs_gen_map,
915 .bs_unmap = bs_gen_unmap,
916 .bs_subregion = bs_gen_subregion,
917
918 /* allocation/deallocation */
919 .bs_alloc = bs_gen_alloc,
920 .bs_free = bs_gen_free,
921
922 /* barrier */
923 .bs_barrier = bs_gen_barrier,
924
925 /* read (single) */
926 .bs_r_1 = swapped_bs_rs_1,
927 .bs_r_2 = swapped_bs_rs_2,
928 .bs_r_4 = swapped_bs_rs_4,
929 .bs_r_8 = swapped_bs_rs_8,
930
931 /* read (single) stream */
932 .bs_r_s_2 = native_bs_rs_2,
933 .bs_r_s_4 = native_bs_rs_4,
934 .bs_r_s_8 = native_bs_rs_8,
935
936 /* read multiple */
937 .bs_rm_1 = swapped_bs_rm_1,
938 .bs_rm_2 = swapped_bs_rm_2,
939 .bs_rm_4 = swapped_bs_rm_4,
940 .bs_rm_8 = swapped_bs_rm_8,
941
942 /* read multiple stream */
943 .bs_rm_s_2 = native_bs_rm_2,
944 .bs_rm_s_4 = native_bs_rm_4,
945 .bs_rm_s_8 = native_bs_rm_8,
946
947 /* read region */
948 .bs_rr_1 = swapped_bs_rr_1,
949 .bs_rr_2 = swapped_bs_rr_2,
950 .bs_rr_4 = swapped_bs_rr_4,
951 .bs_rr_8 = swapped_bs_rr_8,
952
953 /* read region stream */
954 .bs_rr_s_2 = native_bs_rr_2,
955 .bs_rr_s_4 = native_bs_rr_4,
956 .bs_rr_s_8 = native_bs_rr_8,
957
958 /* write (single) */
959 .bs_w_1 = swapped_bs_ws_1,
960 .bs_w_2 = swapped_bs_ws_2,
961 .bs_w_4 = swapped_bs_ws_4,
962 .bs_w_8 = swapped_bs_ws_8,
963
964 /* write (single) stream */
965 .bs_w_s_2 = native_bs_ws_2,
966 .bs_w_s_4 = native_bs_ws_4,
967 .bs_w_s_8 = native_bs_ws_8,
968
969 /* write multiple */
970 .bs_wm_1 = swapped_bs_wm_1,
971 .bs_wm_2 = swapped_bs_wm_2,
972 .bs_wm_4 = swapped_bs_wm_4,
973 .bs_wm_8 = swapped_bs_wm_8,
974
975 /* write multiple stream */
976 .bs_wm_s_2 = native_bs_wm_2,
977 .bs_wm_s_4 = native_bs_wm_4,
978 .bs_wm_s_8 = native_bs_wm_8,
979
980 /* write region */
981 .bs_wr_1 = swapped_bs_wr_1,
982 .bs_wr_2 = swapped_bs_wr_2,
983 .bs_wr_4 = swapped_bs_wr_4,
984 .bs_wr_8 = swapped_bs_wr_8,
985
986 /* write region stream */
987 .bs_wr_s_2 = native_bs_wr_2,
988 .bs_wr_s_4 = native_bs_wr_4,
989 .bs_wr_s_8 = native_bs_wr_8,
990
991 /* set multiple */
992 .bs_sm_1 = swapped_bs_sm_1,
993 .bs_sm_2 = swapped_bs_sm_2,
994 .bs_sm_4 = swapped_bs_sm_4,
995 .bs_sm_8 = swapped_bs_sm_8,
996
997 /* set multiple stream */
998 .bs_sm_s_2 = native_bs_sm_2,
999 .bs_sm_s_4 = native_bs_sm_4,
1000 .bs_sm_s_8 = native_bs_sm_8,
1001
1002 /* set region */
1003 .bs_sr_1 = swapped_bs_sr_1,
1004 .bs_sr_2 = swapped_bs_sr_2,
1005 .bs_sr_4 = swapped_bs_sr_4,
1006 .bs_sr_8 = swapped_bs_sr_8,
1007
1008 /* set region stream */
1009 .bs_sr_s_2 = native_bs_sr_2,
1010 .bs_sr_s_4 = native_bs_sr_4,
1011 .bs_sr_s_8 = native_bs_sr_8,
1012
1013 /* copy region */
1014 .bs_cr_1 = NULL, /* UNIMPLEMENTED */
1015 .bs_cr_2 = NULL, /* UNIMPLEMENTED */
1016 .bs_cr_4 = NULL, /* UNIMPLEMENTED */
1017 .bs_cr_8 = NULL, /* UNIMPLEMENTED */
1018
1019 /* copy region stream */
1020 .bs_cr_s_2 = NULL, /* UNIMPLEMENTED */
1021 .bs_cr_s_4 = NULL, /* UNIMPLEMENTED */
1022 .bs_cr_s_8 = NULL, /* UNIMPLEMENTED */
1023 };
1024