xref: /freebsd-13-stable/sys/mips/nlm/bus_space_rmi.c (revision 3bc80996974a61a4223eae4c1ccd47b6ee32a48a)
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