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