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