1 /*
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
5 * reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28 * THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * NETLOGIC_BSD */
31
32 #include <sys/cdefs.h>
33 #include <sys/param.h>
34 #include <sys/systm.h>
35 #include <sys/bus.h>
36 #include <sys/kernel.h>
37 #include <sys/endian.h>
38 #include <sys/malloc.h>
39 #include <sys/ktr.h>
40
41 #include <vm/vm.h>
42 #include <vm/pmap.h>
43 #include <vm/vm_kern.h>
44 #include <vm/vm_extern.h>
45
46 #include <machine/bus.h>
47 #include <machine/cache.h>
48
49 static int
50 rmi_bus_space_map(void *t, bus_addr_t addr,
51 bus_size_t size, int flags,
52 bus_space_handle_t *bshp);
53
54 static void
55 rmi_bus_space_unmap(void *t, bus_space_handle_t bsh,
56 bus_size_t size);
57
58 static int
59 rmi_bus_space_subregion(void *t,
60 bus_space_handle_t bsh,
61 bus_size_t offset, bus_size_t size,
62 bus_space_handle_t *nbshp);
63
64 static u_int8_t
65 rmi_bus_space_read_1(void *t,
66 bus_space_handle_t handle,
67 bus_size_t offset);
68
69 static u_int16_t
70 rmi_bus_space_read_2(void *t,
71 bus_space_handle_t handle,
72 bus_size_t offset);
73
74 static u_int32_t
75 rmi_bus_space_read_4(void *t,
76 bus_space_handle_t handle,
77 bus_size_t offset);
78
79 static void
80 rmi_bus_space_read_multi_1(void *t,
81 bus_space_handle_t handle,
82 bus_size_t offset, u_int8_t *addr,
83 size_t count);
84
85 static void
86 rmi_bus_space_read_multi_2(void *t,
87 bus_space_handle_t handle,
88 bus_size_t offset, u_int16_t *addr,
89 size_t count);
90
91 static void
92 rmi_bus_space_read_multi_4(void *t,
93 bus_space_handle_t handle,
94 bus_size_t offset, u_int32_t *addr,
95 size_t count);
96
97 static void
98 rmi_bus_space_read_region_1(void *t,
99 bus_space_handle_t bsh,
100 bus_size_t offset, u_int8_t *addr,
101 size_t count);
102
103 static void
104 rmi_bus_space_read_region_2(void *t,
105 bus_space_handle_t bsh,
106 bus_size_t offset, u_int16_t *addr,
107 size_t count);
108
109 static void
110 rmi_bus_space_read_region_4(void *t,
111 bus_space_handle_t bsh,
112 bus_size_t offset, u_int32_t *addr,
113 size_t count);
114
115 static void
116 rmi_bus_space_write_1(void *t,
117 bus_space_handle_t handle,
118 bus_size_t offset, u_int8_t value);
119
120 static void
121 rmi_bus_space_write_2(void *t,
122 bus_space_handle_t handle,
123 bus_size_t offset, u_int16_t value);
124
125 static void
126 rmi_bus_space_write_4(void *t,
127 bus_space_handle_t handle,
128 bus_size_t offset, u_int32_t value);
129
130 static void
131 rmi_bus_space_write_multi_1(void *t,
132 bus_space_handle_t handle,
133 bus_size_t offset,
134 const u_int8_t *addr,
135 size_t count);
136
137 static void
138 rmi_bus_space_write_multi_2(void *t,
139 bus_space_handle_t handle,
140 bus_size_t offset,
141 const u_int16_t *addr,
142 size_t count);
143
144 static void
145 rmi_bus_space_write_multi_4(void *t,
146 bus_space_handle_t handle,
147 bus_size_t offset,
148 const u_int32_t *addr,
149 size_t count);
150
151 static void
152 rmi_bus_space_write_region_2(void *t,
153 bus_space_handle_t bsh,
154 bus_size_t offset,
155 const u_int16_t *addr,
156 size_t count);
157
158 static void
159 rmi_bus_space_write_region_4(void *t,
160 bus_space_handle_t bsh,
161 bus_size_t offset,
162 const u_int32_t *addr,
163 size_t count);
164
165 static void
166 rmi_bus_space_set_region_2(void *t,
167 bus_space_handle_t bsh,
168 bus_size_t offset, u_int16_t value,
169 size_t count);
170 static void
171 rmi_bus_space_set_region_4(void *t,
172 bus_space_handle_t bsh,
173 bus_size_t offset, u_int32_t value,
174 size_t count);
175
176 static void
177 rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
178 bus_size_t offset __unused, bus_size_t len __unused, int flags);
179
180 static void
181 rmi_bus_space_copy_region_2(void *t,
182 bus_space_handle_t bsh1,
183 bus_size_t off1,
184 bus_space_handle_t bsh2,
185 bus_size_t off2, size_t count);
186
187 u_int8_t
188 rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
189 bus_size_t offset);
190
191 static u_int16_t
192 rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
193 bus_size_t offset);
194
195 static u_int32_t
196 rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
197 bus_size_t offset);
198 static void
199 rmi_bus_space_read_multi_stream_1(void *t,
200 bus_space_handle_t handle,
201 bus_size_t offset, u_int8_t *addr,
202 size_t count);
203
204 static void
205 rmi_bus_space_read_multi_stream_2(void *t,
206 bus_space_handle_t handle,
207 bus_size_t offset, u_int16_t *addr,
208 size_t count);
209
210 static void
211 rmi_bus_space_read_multi_stream_4(void *t,
212 bus_space_handle_t handle,
213 bus_size_t offset, u_int32_t *addr,
214 size_t count);
215
216 void
217 rmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
218 bus_size_t offset, u_int8_t value);
219 static void
220 rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
221 bus_size_t offset, u_int16_t value);
222
223 static void
224 rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
225 bus_size_t offset, u_int32_t value);
226
227 static void
228 rmi_bus_space_write_multi_stream_1(void *t,
229 bus_space_handle_t handle,
230 bus_size_t offset,
231 const u_int8_t *addr,
232 size_t count);
233 static void
234 rmi_bus_space_write_multi_stream_2(void *t,
235 bus_space_handle_t handle,
236 bus_size_t offset,
237 const u_int16_t *addr,
238 size_t count);
239
240 static void
241 rmi_bus_space_write_multi_stream_4(void *t,
242 bus_space_handle_t handle,
243 bus_size_t offset,
244 const u_int32_t *addr,
245 size_t count);
246
247 #define TODO() printf("XLP bus space: '%s' unimplemented\n", __func__)
248
249 static struct bus_space local_rmi_bus_space = {
250 /* cookie */
251 (void *)0,
252
253 /* mapping/unmapping */
254 rmi_bus_space_map,
255 rmi_bus_space_unmap,
256 rmi_bus_space_subregion,
257
258 /* allocation/deallocation */
259 NULL,
260 NULL,
261
262 /* barrier */
263 rmi_bus_space_barrier,
264
265 /* read (single) */
266 rmi_bus_space_read_1,
267 rmi_bus_space_read_2,
268 rmi_bus_space_read_4,
269 NULL,
270
271 /* read multiple */
272 rmi_bus_space_read_multi_1,
273 rmi_bus_space_read_multi_2,
274 rmi_bus_space_read_multi_4,
275 NULL,
276
277 /* read region */
278 rmi_bus_space_read_region_1,
279 rmi_bus_space_read_region_2,
280 rmi_bus_space_read_region_4,
281 NULL,
282
283 /* write (single) */
284 rmi_bus_space_write_1,
285 rmi_bus_space_write_2,
286 rmi_bus_space_write_4,
287 NULL,
288
289 /* write multiple */
290 rmi_bus_space_write_multi_1,
291 rmi_bus_space_write_multi_2,
292 rmi_bus_space_write_multi_4,
293 NULL,
294
295 /* write region */
296 NULL,
297 rmi_bus_space_write_region_2,
298 rmi_bus_space_write_region_4,
299 NULL,
300
301 /* set multiple */
302 NULL,
303 NULL,
304 NULL,
305 NULL,
306
307 /* set region */
308 NULL,
309 rmi_bus_space_set_region_2,
310 rmi_bus_space_set_region_4,
311 NULL,
312
313 /* copy */
314 NULL,
315 rmi_bus_space_copy_region_2,
316 NULL,
317 NULL,
318
319 /* read (single) stream */
320 rmi_bus_space_read_stream_1,
321 rmi_bus_space_read_stream_2,
322 rmi_bus_space_read_stream_4,
323 NULL,
324
325 /* read multiple stream */
326 rmi_bus_space_read_multi_stream_1,
327 rmi_bus_space_read_multi_stream_2,
328 rmi_bus_space_read_multi_stream_4,
329 NULL,
330
331 /* read region stream */
332 rmi_bus_space_read_region_1,
333 rmi_bus_space_read_region_2,
334 rmi_bus_space_read_region_4,
335 NULL,
336
337 /* write (single) stream */
338 rmi_bus_space_write_stream_1,
339 rmi_bus_space_write_stream_2,
340 rmi_bus_space_write_stream_4,
341 NULL,
342
343 /* write multiple stream */
344 rmi_bus_space_write_multi_stream_1,
345 rmi_bus_space_write_multi_stream_2,
346 rmi_bus_space_write_multi_stream_4,
347 NULL,
348
349 /* write region stream */
350 NULL,
351 rmi_bus_space_write_region_2,
352 rmi_bus_space_write_region_4,
353 NULL,
354 };
355
356 /* generic bus_space tag */
357 bus_space_tag_t rmi_bus_space = &local_rmi_bus_space;
358
359 /*
360 * Map a region of device bus space into CPU virtual address space.
361 */
362 static int
rmi_bus_space_map(void * t __unused,bus_addr_t addr,bus_size_t size __unused,int flags __unused,bus_space_handle_t * bshp)363 rmi_bus_space_map(void *t __unused, bus_addr_t addr,
364 bus_size_t size __unused, int flags __unused,
365 bus_space_handle_t *bshp)
366 {
367
368 *bshp = MIPS_PHYS_TO_DIRECT_UNCACHED(addr);
369 return (0);
370 }
371
372 /*
373 * Unmap a region of device bus space.
374 */
375 static void
rmi_bus_space_unmap(void * t __unused,bus_space_handle_t bsh __unused,bus_size_t size __unused)376 rmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
377 bus_size_t size __unused)
378 {
379 }
380
381 /*
382 * Get a new handle for a subregion of an already-mapped area of bus space.
383 */
384
385 static int
rmi_bus_space_subregion(void * t __unused,bus_space_handle_t bsh,bus_size_t offset,bus_size_t size __unused,bus_space_handle_t * nbshp)386 rmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
387 bus_size_t offset, bus_size_t size __unused,
388 bus_space_handle_t *nbshp)
389 {
390 *nbshp = bsh + offset;
391 return (0);
392 }
393
394 /*
395 * Read a 1, 2, 4, or 8 byte quantity from bus space
396 * described by tag/handle/offset.
397 */
398
399 static u_int8_t
rmi_bus_space_read_1(void * tag,bus_space_handle_t handle,bus_size_t offset)400 rmi_bus_space_read_1(void *tag, bus_space_handle_t handle,
401 bus_size_t offset)
402 {
403 return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
404 }
405
406 static u_int16_t
rmi_bus_space_read_2(void * tag,bus_space_handle_t handle,bus_size_t offset)407 rmi_bus_space_read_2(void *tag, bus_space_handle_t handle,
408 bus_size_t offset)
409 {
410 return (u_int16_t)(*(volatile u_int16_t *)(handle + offset));
411 }
412
413 static u_int32_t
rmi_bus_space_read_4(void * tag,bus_space_handle_t handle,bus_size_t offset)414 rmi_bus_space_read_4(void *tag, bus_space_handle_t handle,
415 bus_size_t offset)
416 {
417 return (*(volatile u_int32_t *)(handle + offset));
418 }
419
420 /*
421 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
422 * described by tag/handle/offset and copy into buffer provided.
423 */
424 static void
rmi_bus_space_read_multi_1(void * tag,bus_space_handle_t handle,bus_size_t offset,u_int8_t * addr,size_t count)425 rmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
426 bus_size_t offset, u_int8_t *addr, size_t count)
427 {
428 TODO();
429 }
430
431 static void
rmi_bus_space_read_multi_2(void * tag,bus_space_handle_t handle,bus_size_t offset,u_int16_t * addr,size_t count)432 rmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
433 bus_size_t offset, u_int16_t *addr, size_t count)
434 {
435 TODO();
436 }
437
438 static void
rmi_bus_space_read_multi_4(void * tag,bus_space_handle_t handle,bus_size_t offset,u_int32_t * addr,size_t count)439 rmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
440 bus_size_t offset, u_int32_t *addr, size_t count)
441 {
442 TODO();
443 }
444
445 /*
446 * Write the 1, 2, 4, or 8 byte value `value' to bus space
447 * described by tag/handle/offset.
448 */
449
450 static void
rmi_bus_space_write_1(void * tag,bus_space_handle_t handle,bus_size_t offset,u_int8_t value)451 rmi_bus_space_write_1(void *tag, bus_space_handle_t handle,
452 bus_size_t offset, u_int8_t value)
453 {
454 *(volatile u_int8_t *)(handle + offset) = value;
455 }
456
457 static void
rmi_bus_space_write_2(void * tag,bus_space_handle_t handle,bus_size_t offset,u_int16_t value)458 rmi_bus_space_write_2(void *tag, bus_space_handle_t handle,
459 bus_size_t offset, u_int16_t value)
460 {
461 *(volatile u_int16_t *)(handle + offset) = value;
462 }
463
464 static void
rmi_bus_space_write_4(void * tag,bus_space_handle_t handle,bus_size_t offset,u_int32_t value)465 rmi_bus_space_write_4(void *tag, bus_space_handle_t handle,
466 bus_size_t offset, u_int32_t value)
467 {
468 *(volatile u_int32_t *)(handle + offset) = value;
469 }
470
471 /*
472 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
473 * provided to bus space described by tag/handle/offset.
474 */
475
476 static void
rmi_bus_space_write_multi_1(void * tag,bus_space_handle_t handle,bus_size_t offset,const u_int8_t * addr,size_t count)477 rmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
478 bus_size_t offset, const u_int8_t *addr, size_t count)
479 {
480 TODO();
481 }
482
483 static void
rmi_bus_space_write_multi_2(void * tag,bus_space_handle_t handle,bus_size_t offset,const u_int16_t * addr,size_t count)484 rmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
485 bus_size_t offset, const u_int16_t *addr, size_t count)
486 {
487 TODO();
488 }
489
490 static void
rmi_bus_space_write_multi_4(void * tag,bus_space_handle_t handle,bus_size_t offset,const u_int32_t * addr,size_t count)491 rmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
492 bus_size_t offset, const u_int32_t *addr, size_t count)
493 {
494 TODO();
495 }
496
497 /*
498 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
499 * by tag/handle starting at `offset'.
500 */
501
502 static void
rmi_bus_space_set_region_2(void * t,bus_space_handle_t bsh,bus_size_t offset,u_int16_t value,size_t count)503 rmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
504 bus_size_t offset, u_int16_t value, size_t count)
505 {
506 bus_addr_t addr = bsh + offset;
507
508 for (; count != 0; count--, addr += 2)
509 (*(volatile u_int32_t *)(addr)) = value;
510 }
511
512 static void
rmi_bus_space_set_region_4(void * t,bus_space_handle_t bsh,bus_size_t offset,u_int32_t value,size_t count)513 rmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
514 bus_size_t offset, u_int32_t value, size_t count)
515 {
516 bus_addr_t addr = bsh + offset;
517
518 for (; count != 0; count--, addr += 4)
519 (*(volatile u_int32_t *)(addr)) = value;
520 }
521
522 /*
523 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
524 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
525 */
526 static void
rmi_bus_space_copy_region_2(void * t,bus_space_handle_t bsh1,bus_size_t off1,bus_space_handle_t bsh2,bus_size_t off2,size_t count)527 rmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
528 bus_size_t off1, bus_space_handle_t bsh2,
529 bus_size_t off2, size_t count)
530 {
531 printf("bus_space_copy_region_2 - unimplemented\n");
532 }
533
534 /*
535 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
536 * described by tag/handle/offset and copy into buffer provided.
537 */
538
539 u_int8_t
rmi_bus_space_read_stream_1(void * t,bus_space_handle_t handle,bus_size_t offset)540 rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
541 bus_size_t offset)
542 {
543
544 return *((volatile u_int8_t *)(handle + offset));
545 }
546
547 static u_int16_t
rmi_bus_space_read_stream_2(void * t,bus_space_handle_t handle,bus_size_t offset)548 rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
549 bus_size_t offset)
550 {
551 return *(volatile u_int16_t *)(handle + offset);
552 }
553
554 static u_int32_t
rmi_bus_space_read_stream_4(void * t,bus_space_handle_t handle,bus_size_t offset)555 rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
556 bus_size_t offset)
557 {
558 return (*(volatile u_int32_t *)(handle + offset));
559 }
560
561 static void
rmi_bus_space_read_multi_stream_1(void * tag,bus_space_handle_t handle,bus_size_t offset,u_int8_t * addr,size_t count)562 rmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
563 bus_size_t offset, u_int8_t *addr, size_t count)
564 {
565 TODO();
566 }
567
568 static void
rmi_bus_space_read_multi_stream_2(void * tag,bus_space_handle_t handle,bus_size_t offset,u_int16_t * addr,size_t count)569 rmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
570 bus_size_t offset, u_int16_t *addr, size_t count)
571 {
572 TODO();
573 }
574
575 static void
rmi_bus_space_read_multi_stream_4(void * tag,bus_space_handle_t handle,bus_size_t offset,u_int32_t * addr,size_t count)576 rmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
577 bus_size_t offset, u_int32_t *addr, size_t count)
578 {
579 TODO();
580 }
581
582 /*
583 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
584 * described by tag/handle and starting at `offset' and copy into
585 * buffer provided.
586 */
587 void
rmi_bus_space_read_region_1(void * t,bus_space_handle_t bsh,bus_size_t offset,u_int8_t * addr,size_t count)588 rmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
589 bus_size_t offset, u_int8_t *addr, size_t count)
590 {
591 TODO();
592 }
593
594 void
rmi_bus_space_read_region_2(void * t,bus_space_handle_t bsh,bus_size_t offset,u_int16_t * addr,size_t count)595 rmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
596 bus_size_t offset, u_int16_t *addr, size_t count)
597 {
598 TODO();
599 }
600
601 void
rmi_bus_space_read_region_4(void * t,bus_space_handle_t bsh,bus_size_t offset,u_int32_t * addr,size_t count)602 rmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
603 bus_size_t offset, u_int32_t *addr, size_t count)
604 {
605 bus_addr_t baddr = bsh + offset;
606
607 while (count--) {
608 *addr++ = (*(volatile u_int32_t *)(baddr));
609 baddr += 4;
610 }
611 }
612
613 void
rmi_bus_space_write_stream_1(void * t,bus_space_handle_t handle,bus_size_t offset,u_int8_t value)614 rmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
615 bus_size_t offset, u_int8_t value)
616 {
617 TODO();
618 }
619
620 static void
rmi_bus_space_write_stream_2(void * t,bus_space_handle_t handle,bus_size_t offset,u_int16_t value)621 rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
622 bus_size_t offset, u_int16_t value)
623 {
624 TODO();
625 }
626
627 static void
rmi_bus_space_write_stream_4(void * t,bus_space_handle_t handle,bus_size_t offset,u_int32_t value)628 rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
629 bus_size_t offset, u_int32_t value)
630 {
631 TODO();
632 }
633
634 static void
rmi_bus_space_write_multi_stream_1(void * tag,bus_space_handle_t handle,bus_size_t offset,const u_int8_t * addr,size_t count)635 rmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
636 bus_size_t offset, const u_int8_t *addr, size_t count)
637 {
638 TODO();
639 }
640
641 static void
rmi_bus_space_write_multi_stream_2(void * tag,bus_space_handle_t handle,bus_size_t offset,const u_int16_t * addr,size_t count)642 rmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
643 bus_size_t offset, const u_int16_t *addr, size_t count)
644 {
645 TODO();
646 }
647
648 static void
rmi_bus_space_write_multi_stream_4(void * tag,bus_space_handle_t handle,bus_size_t offset,const u_int32_t * addr,size_t count)649 rmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
650 bus_size_t offset, const u_int32_t *addr, size_t count)
651 {
652 TODO();
653 }
654
655 void
rmi_bus_space_write_region_2(void * t,bus_space_handle_t bsh,bus_size_t offset,const u_int16_t * addr,size_t count)656 rmi_bus_space_write_region_2(void *t,
657 bus_space_handle_t bsh,
658 bus_size_t offset,
659 const u_int16_t *addr,
660 size_t count)
661 {
662 TODO();
663 }
664
665 void
rmi_bus_space_write_region_4(void * t,bus_space_handle_t bsh,bus_size_t offset,const u_int32_t * addr,size_t count)666 rmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
667 bus_size_t offset, const u_int32_t *addr, size_t count)
668 {
669 TODO();
670 }
671
672 static void
rmi_bus_space_barrier(void * tag __unused,bus_space_handle_t bsh __unused,bus_size_t offset __unused,bus_size_t len __unused,int flags)673 rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
674 bus_size_t offset __unused, bus_size_t len __unused, int flags)
675 {
676 }
677
678 /*
679 * need a special bus space for this, because the Netlogic SoC
680 * UART allows only 32 bit access to its registers
681 */
682
683 static u_int8_t
rmi_uart_bus_space_read_1(void * tag,bus_space_handle_t handle,bus_size_t offset)684 rmi_uart_bus_space_read_1(void *tag, bus_space_handle_t handle,
685 bus_size_t offset)
686 {
687 return (u_int8_t)(*(volatile u_int32_t *)(handle + offset));
688 }
689
690 static void
rmi_uart_bus_space_write_1(void * tag,bus_space_handle_t handle,bus_size_t offset,u_int8_t value)691 rmi_uart_bus_space_write_1(void *tag, bus_space_handle_t handle,
692 bus_size_t offset, u_int8_t value)
693 {
694 *(volatile u_int32_t *)(handle + offset) = value;
695 }
696
697 static struct bus_space local_rmi_uart_bus_space = {
698 /* cookie */
699 (void *)0,
700
701 /* mapping/unmapping */
702 rmi_bus_space_map,
703 rmi_bus_space_unmap,
704 rmi_bus_space_subregion,
705
706 /* allocation/deallocation */
707 NULL,
708 NULL,
709
710 /* barrier */
711 rmi_bus_space_barrier,
712
713 /* read (single) */
714 rmi_uart_bus_space_read_1, NULL, NULL, NULL,
715
716 /* read multiple */
717 NULL, NULL, NULL, NULL,
718
719 /* read region */
720 NULL, NULL, NULL, NULL,
721
722 /* write (single) */
723 rmi_uart_bus_space_write_1, NULL, NULL, NULL,
724
725 /* write multiple */
726 NULL, NULL, NULL, NULL,
727
728 /* write region */
729 NULL, NULL, NULL, NULL,
730
731 /* set multiple */
732 NULL, NULL, NULL, NULL,
733
734 /* set region */
735 NULL, NULL, NULL, NULL,
736
737 /* copy */
738 NULL, NULL, NULL, NULL,
739
740 /* read (single) stream */
741 NULL, NULL, NULL, NULL,
742
743 /* read multiple stream */
744 NULL, NULL, NULL, NULL,
745
746 /* read region stream */
747 NULL, NULL, NULL, NULL,
748
749 /* write (single) stream */
750 NULL, NULL, NULL, NULL,
751
752 /* write multiple stream */
753 NULL, NULL, NULL, NULL,
754
755 /* write region stream */
756 NULL, NULL, NULL, NULL,
757 };
758
759 /* generic bus_space tag */
760 bus_space_tag_t rmi_uart_bus_space = &local_rmi_uart_bus_space;
761