1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
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__FBSDID("$FreeBSD$");
34
35#include <sys/param.h>
36#include <sys/systm.h>
37#include <sys/bus.h>
38#include <sys/kernel.h>
39#include <sys/endian.h>
40#include <sys/malloc.h>
41#include <sys/ktr.h>
42
43#include <vm/vm.h>
44#include <vm/pmap.h>
45#include <vm/vm_kern.h>
46#include <vm/vm_extern.h>
47
48#include <machine/bus.h>
49#include <machine/cache.h>
50
51static int
52rmi_pci_bus_space_map(void *t, bus_addr_t addr,
53    bus_size_t size, int flags,
54    bus_space_handle_t * bshp);
55
56static void
57rmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh,
58    bus_size_t size);
59
60static int
61rmi_pci_bus_space_subregion(void *t,
62    bus_space_handle_t bsh,
63    bus_size_t offset, bus_size_t size,
64    bus_space_handle_t * nbshp);
65
66static u_int8_t
67rmi_pci_bus_space_read_1(void *t,
68    bus_space_handle_t handle,
69    bus_size_t offset);
70
71static u_int16_t
72rmi_pci_bus_space_read_2(void *t,
73    bus_space_handle_t handle,
74    bus_size_t offset);
75
76static u_int32_t
77rmi_pci_bus_space_read_4(void *t,
78    bus_space_handle_t handle,
79    bus_size_t offset);
80
81static void
82rmi_pci_bus_space_read_multi_1(void *t,
83    bus_space_handle_t handle,
84    bus_size_t offset, u_int8_t * addr,
85    size_t count);
86
87static void
88rmi_pci_bus_space_read_multi_2(void *t,
89    bus_space_handle_t handle,
90    bus_size_t offset, u_int16_t * addr,
91    size_t count);
92
93static void
94rmi_pci_bus_space_read_multi_4(void *t,
95    bus_space_handle_t handle,
96    bus_size_t offset, u_int32_t * addr,
97    size_t count);
98
99static void
100rmi_pci_bus_space_read_region_1(void *t,
101    bus_space_handle_t bsh,
102    bus_size_t offset, u_int8_t * addr,
103    size_t count);
104
105static void
106rmi_pci_bus_space_read_region_2(void *t,
107    bus_space_handle_t bsh,
108    bus_size_t offset, u_int16_t * addr,
109    size_t count);
110
111static void
112rmi_pci_bus_space_read_region_4(void *t,
113    bus_space_handle_t bsh,
114    bus_size_t offset, u_int32_t * addr,
115    size_t count);
116
117static void
118rmi_pci_bus_space_write_1(void *t,
119    bus_space_handle_t handle,
120    bus_size_t offset, u_int8_t value);
121
122static void
123rmi_pci_bus_space_write_2(void *t,
124    bus_space_handle_t handle,
125    bus_size_t offset, u_int16_t value);
126
127static void
128rmi_pci_bus_space_write_4(void *t,
129    bus_space_handle_t handle,
130    bus_size_t offset, u_int32_t value);
131
132static void
133rmi_pci_bus_space_write_multi_1(void *t,
134    bus_space_handle_t handle,
135    bus_size_t offset,
136    const u_int8_t * addr,
137    size_t count);
138
139static void
140rmi_pci_bus_space_write_multi_2(void *t,
141    bus_space_handle_t handle,
142    bus_size_t offset,
143    const u_int16_t * addr,
144    size_t count);
145
146static void
147rmi_pci_bus_space_write_multi_4(void *t,
148    bus_space_handle_t handle,
149    bus_size_t offset,
150    const u_int32_t * addr,
151    size_t count);
152
153static void
154rmi_pci_bus_space_write_region_2(void *t,
155    bus_space_handle_t bsh,
156    bus_size_t offset,
157    const u_int16_t * addr,
158    size_t count);
159
160static void
161rmi_pci_bus_space_write_region_4(void *t,
162    bus_space_handle_t bsh,
163    bus_size_t offset,
164    const u_int32_t * addr,
165    size_t count);
166
167static void
168rmi_pci_bus_space_set_region_2(void *t,
169    bus_space_handle_t bsh,
170    bus_size_t offset, u_int16_t value,
171    size_t count);
172
173static void
174rmi_pci_bus_space_set_region_4(void *t,
175    bus_space_handle_t bsh,
176    bus_size_t offset, u_int32_t value,
177    size_t count);
178
179static void
180rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
181    bus_size_t offset __unused, bus_size_t len __unused, int flags);
182
183static void
184rmi_pci_bus_space_copy_region_2(void *t,
185    bus_space_handle_t bsh1,
186    bus_size_t off1,
187    bus_space_handle_t bsh2,
188    bus_size_t off2, size_t count);
189
190u_int8_t
191rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
192    bus_size_t offset);
193
194static u_int16_t
195rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
196    bus_size_t offset);
197
198static u_int32_t
199rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
200    bus_size_t offset);
201
202static void
203rmi_pci_bus_space_read_multi_stream_1(void *t,
204    bus_space_handle_t handle,
205    bus_size_t offset, u_int8_t * addr,
206    size_t count);
207
208static void
209rmi_pci_bus_space_read_multi_stream_2(void *t,
210    bus_space_handle_t handle,
211    bus_size_t offset, u_int16_t * addr,
212    size_t count);
213
214static void
215rmi_pci_bus_space_read_multi_stream_4(void *t,
216    bus_space_handle_t handle,
217    bus_size_t offset, u_int32_t * addr,
218    size_t count);
219
220void
221rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
222    bus_size_t offset, u_int8_t value);
223
224static void
225rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
226    bus_size_t offset, u_int16_t value);
227
228static void
229rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
230    bus_size_t offset, u_int32_t value);
231
232static void
233rmi_pci_bus_space_write_multi_stream_1(void *t,
234    bus_space_handle_t handle,
235    bus_size_t offset,
236    const u_int8_t * addr,
237    size_t count);
238
239static void
240rmi_pci_bus_space_write_multi_stream_2(void *t,
241    bus_space_handle_t handle,
242    bus_size_t offset,
243    const u_int16_t * addr,
244    size_t count);
245
246static void
247rmi_pci_bus_space_write_multi_stream_4(void *t,
248    bus_space_handle_t handle,
249    bus_size_t offset,
250    const u_int32_t * addr,
251    size_t count);
252
253#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__)
254
255static struct bus_space local_rmi_pci_bus_space = {
256	/* cookie */
257	(void *)0,
258
259	/* mapping/unmapping */
260	rmi_pci_bus_space_map,
261	rmi_pci_bus_space_unmap,
262	rmi_pci_bus_space_subregion,
263
264	/* allocation/deallocation */
265	NULL,
266	NULL,
267
268	/* barrier */
269	rmi_pci_bus_space_barrier,
270
271	/* read (single) */
272	rmi_pci_bus_space_read_1,
273	rmi_pci_bus_space_read_2,
274	rmi_pci_bus_space_read_4,
275	NULL,
276
277	/* read multiple */
278	rmi_pci_bus_space_read_multi_1,
279	rmi_pci_bus_space_read_multi_2,
280	rmi_pci_bus_space_read_multi_4,
281	NULL,
282
283	/* read region */
284	rmi_pci_bus_space_read_region_1,
285	rmi_pci_bus_space_read_region_2,
286	rmi_pci_bus_space_read_region_4,
287	NULL,
288
289	/* write (single) */
290	rmi_pci_bus_space_write_1,
291	rmi_pci_bus_space_write_2,
292	rmi_pci_bus_space_write_4,
293	NULL,
294
295	/* write multiple */
296	rmi_pci_bus_space_write_multi_1,
297	rmi_pci_bus_space_write_multi_2,
298	rmi_pci_bus_space_write_multi_4,
299	NULL,
300
301	/* write region */
302	NULL,
303	rmi_pci_bus_space_write_region_2,
304	rmi_pci_bus_space_write_region_4,
305	NULL,
306
307	/* set multiple */
308	NULL,
309	NULL,
310	NULL,
311	NULL,
312
313	/* set region */
314	NULL,
315	rmi_pci_bus_space_set_region_2,
316	rmi_pci_bus_space_set_region_4,
317	NULL,
318
319	/* copy */
320	NULL,
321	rmi_pci_bus_space_copy_region_2,
322	NULL,
323	NULL,
324
325	/* read (single) stream */
326	rmi_pci_bus_space_read_stream_1,
327	rmi_pci_bus_space_read_stream_2,
328	rmi_pci_bus_space_read_stream_4,
329	NULL,
330
331	/* read multiple stream */
332	rmi_pci_bus_space_read_multi_stream_1,
333	rmi_pci_bus_space_read_multi_stream_2,
334	rmi_pci_bus_space_read_multi_stream_4,
335	NULL,
336
337	/* read region stream */
338	rmi_pci_bus_space_read_region_1,
339	rmi_pci_bus_space_read_region_2,
340	rmi_pci_bus_space_read_region_4,
341	NULL,
342
343	/* write (single) stream */
344	rmi_pci_bus_space_write_stream_1,
345	rmi_pci_bus_space_write_stream_2,
346	rmi_pci_bus_space_write_stream_4,
347	NULL,
348
349	/* write multiple stream */
350	rmi_pci_bus_space_write_multi_stream_1,
351	rmi_pci_bus_space_write_multi_stream_2,
352	rmi_pci_bus_space_write_multi_stream_4,
353	NULL,
354
355	/* write region stream */
356	NULL,
357	rmi_pci_bus_space_write_region_2,
358	rmi_pci_bus_space_write_region_4,
359	NULL,
360};
361
362/* generic bus_space tag */
363bus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space;
364
365/*
366 * Map a region of device bus space into CPU virtual address space.
367 */
368static int
369rmi_pci_bus_space_map(void *t __unused, bus_addr_t addr,
370    bus_size_t size __unused, int flags __unused,
371    bus_space_handle_t * bshp)
372{
373	*bshp = addr;
374	return (0);
375}
376
377/*
378 * Unmap a region of device bus space.
379 */
380static void
381rmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
382    bus_size_t size __unused)
383{
384}
385
386/*
387 * Get a new handle for a subregion of an already-mapped area of bus space.
388 */
389
390static int
391rmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
392    bus_size_t offset, bus_size_t size __unused,
393    bus_space_handle_t * nbshp)
394{
395	*nbshp = bsh + offset;
396	return (0);
397}
398
399/*
400 * Read a 1, 2, 4, or 8 byte quantity from bus space
401 * described by tag/handle/offset.
402 */
403
404static u_int8_t
405rmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle,
406    bus_size_t offset)
407{
408	return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
409}
410
411static u_int16_t
412rmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle,
413    bus_size_t offset)
414{
415	u_int16_t value;
416
417	value = *(volatile u_int16_t *)(handle + offset);
418	return bswap16(value);
419}
420
421static u_int32_t
422rmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle,
423    bus_size_t offset)
424{
425	uint32_t value;
426
427	value = *(volatile u_int32_t *)(handle + offset);
428	return bswap32(value);
429}
430
431/*
432 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
433 * described by tag/handle/offset and copy into buffer provided.
434 */
435static void
436rmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
437    bus_size_t offset, u_int8_t * addr, size_t count)
438{
439	while (count--) {
440		*addr = *(volatile u_int8_t *)(handle + offset);
441		addr++;
442	}
443}
444
445static void
446rmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
447    bus_size_t offset, u_int16_t * addr, size_t count)
448{
449
450	while (count--) {
451		*addr = *(volatile u_int16_t *)(handle + offset);
452		*addr = bswap16(*addr);
453		addr++;
454	}
455}
456
457static void
458rmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
459    bus_size_t offset, u_int32_t * addr, size_t count)
460{
461
462	while (count--) {
463		*addr = *(volatile u_int32_t *)(handle + offset);
464		*addr = bswap32(*addr);
465		addr++;
466	}
467}
468
469/*
470 * Write the 1, 2, 4, or 8 byte value `value' to bus space
471 * described by tag/handle/offset.
472 */
473
474static void
475rmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle,
476    bus_size_t offset, u_int8_t value)
477{
478	mips_sync();
479	*(volatile u_int8_t *)(handle + offset) = value;
480}
481
482static void
483rmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle,
484    bus_size_t offset, u_int16_t value)
485{
486	mips_sync();
487	*(volatile u_int16_t *)(handle + offset) = bswap16(value);
488}
489
490static void
491rmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle,
492    bus_size_t offset, u_int32_t value)
493{
494	mips_sync();
495	*(volatile u_int32_t *)(handle + offset) = bswap32(value);
496}
497
498/*
499 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
500 * provided to bus space described by tag/handle/offset.
501 */
502
503static void
504rmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
505    bus_size_t offset, const u_int8_t * addr, size_t count)
506{
507	mips_sync();
508	while (count--) {
509		(*(volatile u_int8_t *)(handle + offset)) = *addr;
510		addr++;
511	}
512}
513
514static void
515rmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
516    bus_size_t offset, const u_int16_t * addr, size_t count)
517{
518	mips_sync();
519	while (count--) {
520		(*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr);
521		addr++;
522	}
523}
524
525static void
526rmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
527    bus_size_t offset, const u_int32_t * addr, size_t count)
528{
529	mips_sync();
530	while (count--) {
531		(*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr);
532		addr++;
533	}
534}
535
536/*
537 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
538 * by tag/handle starting at `offset'.
539 */
540
541static void
542rmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
543    bus_size_t offset, u_int16_t value, size_t count)
544{
545	bus_addr_t addr = bsh + offset;
546
547	for (; count != 0; count--, addr += 2)
548		(*(volatile u_int16_t *)(addr)) = value;
549}
550
551static void
552rmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
553    bus_size_t offset, u_int32_t value, size_t count)
554{
555	bus_addr_t addr = bsh + offset;
556
557	for (; count != 0; count--, addr += 4)
558		(*(volatile u_int32_t *)(addr)) = value;
559}
560
561/*
562 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
563 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
564 */
565static void
566rmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
567    bus_size_t off1, bus_space_handle_t bsh2,
568    bus_size_t off2, size_t count)
569{
570	TODO();
571}
572
573/*
574 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
575 * described by tag/handle/offset and copy into buffer provided.
576 */
577
578u_int8_t
579rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
580    bus_size_t offset)
581{
582
583	return *((volatile u_int8_t *)(handle + offset));
584}
585
586static u_int16_t
587rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
588    bus_size_t offset)
589{
590	return *(volatile u_int16_t *)(handle + offset);
591}
592
593static u_int32_t
594rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
595    bus_size_t offset)
596{
597	return (*(volatile u_int32_t *)(handle + offset));
598}
599
600static void
601rmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
602    bus_size_t offset, u_int8_t * addr, size_t count)
603{
604	while (count--) {
605		*addr = (*(volatile u_int8_t *)(handle + offset));
606		addr++;
607	}
608}
609
610static void
611rmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
612    bus_size_t offset, u_int16_t * addr, size_t count)
613{
614	while (count--) {
615		*addr = (*(volatile u_int16_t *)(handle + offset));
616		addr++;
617	}
618}
619
620static void
621rmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
622    bus_size_t offset, u_int32_t * addr, size_t count)
623{
624	while (count--) {
625		*addr = (*(volatile u_int32_t *)(handle + offset));
626		addr++;
627	}
628}
629
630/*
631 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
632 * described by tag/handle and starting at `offset' and copy into
633 * buffer provided.
634 */
635void
636rmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
637    bus_size_t offset, u_int8_t * addr, size_t count)
638{
639	bus_addr_t baddr = bsh + offset;
640
641	while (count--) {
642		*addr++ = (*(volatile u_int8_t *)(baddr));
643		baddr += 1;
644	}
645}
646
647void
648rmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
649    bus_size_t offset, u_int16_t * addr, size_t count)
650{
651	bus_addr_t baddr = bsh + offset;
652
653	while (count--) {
654		*addr++ = (*(volatile u_int16_t *)(baddr));
655		baddr += 2;
656	}
657}
658
659void
660rmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
661    bus_size_t offset, u_int32_t * addr, size_t count)
662{
663	bus_addr_t baddr = bsh + offset;
664
665	while (count--) {
666		*addr++ = (*(volatile u_int32_t *)(baddr));
667		baddr += 4;
668	}
669}
670
671void
672rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
673    bus_size_t offset, u_int8_t value)
674{
675	mips_sync();
676	*(volatile u_int8_t *)(handle + offset) = value;
677}
678
679static void
680rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
681    bus_size_t offset, u_int16_t value)
682{
683	mips_sync();
684	*(volatile u_int16_t *)(handle + offset) = value;
685}
686
687static void
688rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
689    bus_size_t offset, u_int32_t value)
690{
691	mips_sync();
692	*(volatile u_int32_t *)(handle + offset) = value;
693}
694
695static void
696rmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
697    bus_size_t offset, const u_int8_t * addr, size_t count)
698{
699	mips_sync();
700	while (count--) {
701		(*(volatile u_int8_t *)(handle + offset)) = *addr;
702		addr++;
703	}
704}
705
706static void
707rmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
708    bus_size_t offset, const u_int16_t * addr, size_t count)
709{
710	mips_sync();
711	while (count--) {
712		(*(volatile u_int16_t *)(handle + offset)) = *addr;
713		addr++;
714	}
715}
716
717static void
718rmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
719    bus_size_t offset, const u_int32_t * addr, size_t count)
720{
721	mips_sync();
722	while (count--) {
723		(*(volatile u_int32_t *)(handle + offset)) = *addr;
724		addr++;
725	}
726}
727
728void
729rmi_pci_bus_space_write_region_2(void *t,
730    bus_space_handle_t bsh,
731    bus_size_t offset,
732    const u_int16_t * addr,
733    size_t count)
734{
735	bus_addr_t baddr = (bus_addr_t) bsh + offset;
736
737	while (count--) {
738		(*(volatile u_int16_t *)(baddr)) = *addr;
739		addr++;
740		baddr += 2;
741	}
742}
743
744void
745rmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
746    bus_size_t offset, const u_int32_t * addr, size_t count)
747{
748	bus_addr_t baddr = bsh + offset;
749
750	while (count--) {
751		(*(volatile u_int32_t *)(baddr)) = *addr;
752		addr++;
753		baddr += 4;
754	}
755}
756
757static void
758rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
759    bus_size_t offset __unused, bus_size_t len __unused, int flags)
760{
761
762}
763