xref: /netbsd/sys/arch/mips/alchemy/au_wired_space.c (revision 132587bf)
1*132587bfSthorpej /* $NetBSD: au_wired_space.c,v 1.11 2021/01/04 17:35:12 thorpej Exp $ */
2d8b2de51Sgdamore 
3d8b2de51Sgdamore /*-
4d8b2de51Sgdamore  * Copyright (c) 2006 Itronix Inc.
5d8b2de51Sgdamore  * All rights reserved.
6d8b2de51Sgdamore  *
7d8b2de51Sgdamore  * Written by Garrett D'Amore for Itronix Inc.
8d8b2de51Sgdamore  *
9d8b2de51Sgdamore  * Redistribution and use in source and binary forms, with or without
10d8b2de51Sgdamore  * modification, are permitted provided that the following conditions
11d8b2de51Sgdamore  * are met:
12d8b2de51Sgdamore  * 1. Redistributions of source code must retain the above copyright
13d8b2de51Sgdamore  *    notice, this list of conditions and the following disclaimer.
14d8b2de51Sgdamore  * 2. Redistributions in binary form must reproduce the above copyright
15d8b2de51Sgdamore  *    notice, this list of conditions and the following disclaimer in the
16d8b2de51Sgdamore  *    documentation and/or other materials provided with the distribution.
17d8b2de51Sgdamore  * 3. The name of Itronix Inc. may not be used to endorse
18d8b2de51Sgdamore  *    or promote products derived from this software without specific
19d8b2de51Sgdamore  *    prior written permission.
20d8b2de51Sgdamore  *
21d8b2de51Sgdamore  * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND
22d8b2de51Sgdamore  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23d8b2de51Sgdamore  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24d8b2de51Sgdamore  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY
25d8b2de51Sgdamore  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26d8b2de51Sgdamore  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27d8b2de51Sgdamore  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28d8b2de51Sgdamore  * ON ANY THEORY OF LIABILITY, WHETHER IN
29d8b2de51Sgdamore  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30d8b2de51Sgdamore  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31d8b2de51Sgdamore  * POSSIBILITY OF SUCH DAMAGE.
32d8b2de51Sgdamore  */
33d8b2de51Sgdamore /*
34d8b2de51Sgdamore  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
35d8b2de51Sgdamore  * All rights reserved.
36d8b2de51Sgdamore  *
37d8b2de51Sgdamore  * This code is derived from software contributed to The NetBSD Foundation
38d8b2de51Sgdamore  * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace
39d8b2de51Sgdamore  * Simulation Facility, NASA Ames Research Center.
40d8b2de51Sgdamore  *
41d8b2de51Sgdamore  * Redistribution and use in source and binary forms, with or without
42d8b2de51Sgdamore  * modification, are permitted provided that the following conditions
43d8b2de51Sgdamore  * are met:
44d8b2de51Sgdamore  * 1. Redistributions of source code must retain the above copyright
45d8b2de51Sgdamore  *    notice, this list of conditions and the following disclaimer.
46d8b2de51Sgdamore  * 2. Redistributions in binary form must reproduce the above copyright
47d8b2de51Sgdamore  *    notice, this list of conditions and the following disclaimer in the
48d8b2de51Sgdamore  *    documentation and/or other materials provided with the distribution.
49d8b2de51Sgdamore  *
50d8b2de51Sgdamore  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
51d8b2de51Sgdamore  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
52d8b2de51Sgdamore  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
53d8b2de51Sgdamore  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
54d8b2de51Sgdamore  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
55d8b2de51Sgdamore  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
56d8b2de51Sgdamore  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
57d8b2de51Sgdamore  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
58d8b2de51Sgdamore  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
59d8b2de51Sgdamore  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
60d8b2de51Sgdamore  * POSSIBILITY OF SUCH DAMAGE.
61d8b2de51Sgdamore  */
62d8b2de51Sgdamore 
63d8b2de51Sgdamore #include <sys/cdefs.h>
64*132587bfSthorpej __KERNEL_RCSID(0, "$NetBSD: au_wired_space.c,v 1.11 2021/01/04 17:35:12 thorpej Exp $");
65d8b2de51Sgdamore 
66d8b2de51Sgdamore /*
67d8b2de51Sgdamore  * This provides mappings for the upper I/O regions used on some
68c050474dSsimonb  * Alchemy parts, e.g. PCI and PCMCIA spaces.  These spaces can be
69c050474dSsimonb  * accessed using wired TLB entries.
70d8b2de51Sgdamore  */
71d8b2de51Sgdamore 
72d8b2de51Sgdamore #include <sys/param.h>
73d8b2de51Sgdamore #include <sys/systm.h>
74d8b2de51Sgdamore #include <sys/extent.h>
75*132587bfSthorpej #include <sys/kmem.h>
76d8b2de51Sgdamore #include <sys/endian.h>
77d8b2de51Sgdamore 
787bec7338Sdyoung #include <sys/bus.h>
79a71ca4f4Smatt #include <mips/locore.h>
80d8b2de51Sgdamore #include <machine/wired_map.h>
81d8b2de51Sgdamore #include <mips/alchemy/include/au_wired_space.h>
82d8b2de51Sgdamore 
83d8b2de51Sgdamore #ifndef	AU_WIRED_EXTENT_SZ
84d8b2de51Sgdamore #define	AU_WIRED_EXTENT_SZ	EXTENT_FIXED_STORAGE_SIZE(10)
85d8b2de51Sgdamore #endif
86d8b2de51Sgdamore 
87d8b2de51Sgdamore typedef struct au_wired_cookie {
88d8b2de51Sgdamore 	const char	*c_name;
89d8b2de51Sgdamore 	bus_addr_t	c_start;
90d8b2de51Sgdamore 	bus_size_t	c_size;
91d8b2de51Sgdamore 	paddr_t		c_pbase;
92d8b2de51Sgdamore 	int		c_flags;
93d8b2de51Sgdamore 	int		c_swswap;
94712239e3Sthorpej 	bool		c_hwswap;
95d8b2de51Sgdamore 	struct extent	*c_extent;
96d8b2de51Sgdamore 	long		c_exstore[AU_WIRED_EXTENT_SZ/sizeof (long)];
97d8b2de51Sgdamore } au_wired_cookie_t;
98d8b2de51Sgdamore 
99d8b2de51Sgdamore int au_wired_map(void *, bus_addr_t, bus_size_t, int,
100d8b2de51Sgdamore     bus_space_handle_t *, int);
101d8b2de51Sgdamore void au_wired_unmap(void *, bus_space_handle_t, bus_size_t, int);
102d8b2de51Sgdamore void *au_wired_vaddr(void *, bus_space_handle_t);
103d8b2de51Sgdamore int au_wired_subregion(void *, bus_space_handle_t, bus_size_t, bus_size_t,
104d8b2de51Sgdamore     bus_space_handle_t *);
105d8b2de51Sgdamore paddr_t au_wired_mmap(void *, bus_addr_t, off_t, int, int);
106d8b2de51Sgdamore int au_wired_alloc(void *, bus_addr_t, bus_addr_t, bus_size_t, bus_size_t,
107d8b2de51Sgdamore     bus_size_t, int, bus_addr_t *, bus_space_handle_t *);
108d8b2de51Sgdamore void au_wired_free(void *, bus_space_handle_t, bus_size_t);
109d8b2de51Sgdamore void au_wired_barrier(void *, bus_space_handle_t, bus_size_t, bus_size_t, int);
110d8b2de51Sgdamore uint8_t au_wired_r_1(void *, bus_space_handle_t, bus_size_t);
111d8b2de51Sgdamore uint16_t au_wired_r_2(void *, bus_space_handle_t, bus_size_t);
112d8b2de51Sgdamore uint32_t au_wired_r_4(void *, bus_space_handle_t, bus_size_t);
113d8b2de51Sgdamore uint64_t au_wired_r_8(void *, bus_space_handle_t, bus_size_t);
114d8b2de51Sgdamore void au_wired_rm_1(void *, bus_space_handle_t, bus_size_t, uint8_t *,
115d8b2de51Sgdamore     bus_size_t);
116d8b2de51Sgdamore void au_wired_rm_2(void *, bus_space_handle_t, bus_size_t, uint16_t *,
117d8b2de51Sgdamore     bus_size_t);
118d8b2de51Sgdamore void au_wired_rm_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
119d8b2de51Sgdamore     bus_size_t);
120d8b2de51Sgdamore void au_wired_rm_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
121d8b2de51Sgdamore     bus_size_t);
122d8b2de51Sgdamore void au_wired_rr_1(void *, bus_space_handle_t, bus_size_t, uint8_t *,
123d8b2de51Sgdamore     bus_size_t);
124d8b2de51Sgdamore void au_wired_rr_2(void *, bus_space_handle_t, bus_size_t, uint16_t *,
125d8b2de51Sgdamore     bus_size_t);
126d8b2de51Sgdamore void au_wired_rr_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
127d8b2de51Sgdamore     bus_size_t);
128d8b2de51Sgdamore void au_wired_rr_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
129d8b2de51Sgdamore     bus_size_t);
130d8b2de51Sgdamore void au_wired_w_1(void *, bus_space_handle_t, bus_size_t, uint8_t);
131d8b2de51Sgdamore void au_wired_w_2(void *, bus_space_handle_t, bus_size_t, uint16_t);
132d8b2de51Sgdamore void au_wired_w_4(void *, bus_space_handle_t, bus_size_t, uint32_t);
133d8b2de51Sgdamore void au_wired_w_8(void *, bus_space_handle_t, bus_size_t, uint64_t);
134d8b2de51Sgdamore void au_wired_wm_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *,
135d8b2de51Sgdamore     bus_size_t);
136d8b2de51Sgdamore void au_wired_wm_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *,
137d8b2de51Sgdamore     bus_size_t);
138d8b2de51Sgdamore void au_wired_wm_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
139d8b2de51Sgdamore     bus_size_t);
140d8b2de51Sgdamore void au_wired_wm_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
141d8b2de51Sgdamore     bus_size_t);
142d8b2de51Sgdamore void au_wired_wr_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *,
143d8b2de51Sgdamore     bus_size_t);
144d8b2de51Sgdamore void au_wired_wr_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *,
145d8b2de51Sgdamore     bus_size_t);
146d8b2de51Sgdamore void au_wired_wr_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
147d8b2de51Sgdamore     bus_size_t);
148d8b2de51Sgdamore void au_wired_wr_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
149d8b2de51Sgdamore     bus_size_t);
150d8b2de51Sgdamore void au_wired_sm_1(void *, bus_space_handle_t, bus_size_t, uint8_t,
151d8b2de51Sgdamore     bus_size_t);
152d8b2de51Sgdamore void au_wired_sm_2(void *, bus_space_handle_t, bus_size_t, uint16_t,
153d8b2de51Sgdamore     bus_size_t);
154d8b2de51Sgdamore void au_wired_sm_4(void *, bus_space_handle_t, bus_size_t, uint32_t,
155d8b2de51Sgdamore     bus_size_t);
156d8b2de51Sgdamore void au_wired_sm_8(void *, bus_space_handle_t, bus_size_t, uint64_t,
157d8b2de51Sgdamore     bus_size_t);
158d8b2de51Sgdamore void au_wired_sr_1(void *, bus_space_handle_t, bus_size_t, uint8_t,
159d8b2de51Sgdamore     bus_size_t);
160d8b2de51Sgdamore void au_wired_sr_2(void *, bus_space_handle_t, bus_size_t, uint16_t,
161d8b2de51Sgdamore     bus_size_t);
162d8b2de51Sgdamore void au_wired_sr_4(void *, bus_space_handle_t, bus_size_t, uint32_t,
163d8b2de51Sgdamore     bus_size_t);
164d8b2de51Sgdamore void au_wired_sr_8(void *, bus_space_handle_t, bus_size_t, uint64_t,
165d8b2de51Sgdamore     bus_size_t);
166d8b2de51Sgdamore void au_wired_c_1(void *, bus_space_handle_t, bus_size_t,
167d8b2de51Sgdamore     bus_space_handle_t, bus_size_t, bus_size_t);
168d8b2de51Sgdamore void au_wired_c_2(void *, bus_space_handle_t, bus_size_t,
169d8b2de51Sgdamore     bus_space_handle_t, bus_size_t, bus_size_t);
170d8b2de51Sgdamore void au_wired_c_4(void *, bus_space_handle_t, bus_size_t,
171d8b2de51Sgdamore     bus_space_handle_t, bus_size_t, bus_size_t);
172d8b2de51Sgdamore void au_wired_c_8(void *, bus_space_handle_t, bus_size_t,
173d8b2de51Sgdamore     bus_space_handle_t, bus_size_t, bus_size_t);
174d8b2de51Sgdamore uint16_t au_wired_rs_2(void *, bus_space_handle_t, bus_size_t);
175d8b2de51Sgdamore uint32_t au_wired_rs_4(void *, bus_space_handle_t, bus_size_t);
176d8b2de51Sgdamore uint64_t au_wired_rs_8(void *, bus_space_handle_t, bus_size_t);
177d8b2de51Sgdamore void au_wired_ws_2(void *, bus_space_handle_t, bus_size_t, uint16_t);
178d8b2de51Sgdamore void au_wired_ws_4(void *, bus_space_handle_t, bus_size_t, uint32_t);
179d8b2de51Sgdamore void au_wired_ws_8(void *, bus_space_handle_t, bus_size_t, uint64_t);
180d8b2de51Sgdamore void au_wired_rms_2(void *, bus_space_handle_t, bus_size_t, uint16_t *,
181d8b2de51Sgdamore     bus_size_t);
182d8b2de51Sgdamore void au_wired_rms_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
183d8b2de51Sgdamore     bus_size_t);
184d8b2de51Sgdamore void au_wired_rms_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
185d8b2de51Sgdamore     bus_size_t);
186d8b2de51Sgdamore void au_wired_rrs_2(void *, bus_space_handle_t, bus_size_t, uint16_t *,
187d8b2de51Sgdamore     bus_size_t);
188d8b2de51Sgdamore void au_wired_rrs_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
189d8b2de51Sgdamore     bus_size_t);
190d8b2de51Sgdamore void au_wired_rrs_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
191d8b2de51Sgdamore     bus_size_t);
192d8b2de51Sgdamore void au_wired_wms_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *,
193d8b2de51Sgdamore     bus_size_t);
194d8b2de51Sgdamore void au_wired_wms_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
195d8b2de51Sgdamore     bus_size_t);
196d8b2de51Sgdamore void au_wired_wms_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
197d8b2de51Sgdamore     bus_size_t);
198d8b2de51Sgdamore void au_wired_wrs_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *,
199d8b2de51Sgdamore     bus_size_t);
200d8b2de51Sgdamore void au_wired_wrs_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
201d8b2de51Sgdamore     bus_size_t);
202d8b2de51Sgdamore void au_wired_wrs_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
203d8b2de51Sgdamore     bus_size_t);
204d8b2de51Sgdamore 
205d8b2de51Sgdamore int
au_wired_map(void * cookie,bus_addr_t addr,bus_size_t size,int flags,bus_space_handle_t * bshp,int acct)206d8b2de51Sgdamore au_wired_map(void *cookie, bus_addr_t addr, bus_size_t size,
207d8b2de51Sgdamore     int flags, bus_space_handle_t *bshp, int acct)
208d8b2de51Sgdamore {
209d8b2de51Sgdamore 	int			err;
210d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)cookie;
211d8b2de51Sgdamore 	paddr_t			pa;
212d8b2de51Sgdamore 
213d8b2de51Sgdamore 	/* make sure we can map this bus address */
214d8b2de51Sgdamore 	if (addr < c->c_start ||
215d8b2de51Sgdamore 	    addr + size > c->c_start + c->c_size)
216d8b2de51Sgdamore 		return EINVAL;
217d8b2de51Sgdamore 
218d8b2de51Sgdamore 	pa = c->c_pbase + (addr - c->c_start);
219d8b2de51Sgdamore 
220d8b2de51Sgdamore 	if (!mips3_wired_enter_region(addr, pa, size))
221d8b2de51Sgdamore 		return ENOMEM;
222d8b2de51Sgdamore 
223d8b2de51Sgdamore 	/*
224d8b2de51Sgdamore 	 * bus addresses are taken from virtual address space.
225d8b2de51Sgdamore 	 */
226d8b2de51Sgdamore 	if (acct && c->c_extent != NULL) {
227d8b2de51Sgdamore 		err = extent_alloc_region(c->c_extent, addr, size, EX_NOWAIT);
228d8b2de51Sgdamore 		if (err)
229d8b2de51Sgdamore 			return err;
230d8b2de51Sgdamore 	}
231d8b2de51Sgdamore 
232d8b2de51Sgdamore 	*bshp = addr;
233d8b2de51Sgdamore 
234d8b2de51Sgdamore 	return 0;
235d8b2de51Sgdamore }
236d8b2de51Sgdamore 
237d8b2de51Sgdamore void
au_wired_unmap(void * cookie,bus_space_handle_t bsh,bus_size_t size,int acct)238d8b2de51Sgdamore au_wired_unmap(void *cookie, bus_space_handle_t bsh, bus_size_t size, int acct)
239d8b2de51Sgdamore {
240d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)cookie;
241d8b2de51Sgdamore 
242d8b2de51Sgdamore 	if (acct != 0 && c->c_extent != NULL) {
243d8b2de51Sgdamore 		extent_free(c->c_extent, (vaddr_t)bsh, size, EX_NOWAIT);
244d8b2de51Sgdamore 	}
245d8b2de51Sgdamore }
246d8b2de51Sgdamore 
247d8b2de51Sgdamore int
au_wired_subregion(void * cookie,bus_space_handle_t bsh,bus_size_t offset,bus_size_t size,bus_space_handle_t * nbshp)248d8b2de51Sgdamore au_wired_subregion(void *cookie, bus_space_handle_t bsh,
249d8b2de51Sgdamore     bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp)
250d8b2de51Sgdamore {
251d8b2de51Sgdamore 
252d8b2de51Sgdamore 	*nbshp = bsh + offset;
253d8b2de51Sgdamore 	return 0;
254d8b2de51Sgdamore }
255d8b2de51Sgdamore 
256d8b2de51Sgdamore void *
au_wired_vaddr(void * cookie,bus_space_handle_t bsh)257d8b2de51Sgdamore au_wired_vaddr(void *cookie, bus_space_handle_t bsh)
258d8b2de51Sgdamore {
259d8b2de51Sgdamore 
260d8b2de51Sgdamore 	return ((void *)bsh);
261d8b2de51Sgdamore }
262d8b2de51Sgdamore 
263d8b2de51Sgdamore paddr_t
au_wired_mmap(void * cookie,bus_addr_t addr,off_t off,int prot,int flags)264d8b2de51Sgdamore au_wired_mmap(void *cookie, bus_addr_t addr, off_t off, int prot, int flags)
265d8b2de51Sgdamore {
266d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)cookie;
267d8b2de51Sgdamore 
268d8b2de51Sgdamore 	/* I/O spaces should not be directly mmap'ed */
269d8b2de51Sgdamore 	if (c->c_flags & AU_WIRED_SPACE_IO)
270d8b2de51Sgdamore 		return -1;
271d8b2de51Sgdamore 
272d8b2de51Sgdamore 	if (addr < c->c_start || (addr + off) >= (c->c_start + c->c_size))
273d8b2de51Sgdamore 		return -1;
274d8b2de51Sgdamore 
275d8b2de51Sgdamore 	return mips_btop(c->c_pbase + (addr - c->c_start) + off);
276d8b2de51Sgdamore }
277d8b2de51Sgdamore 
278d8b2de51Sgdamore int
au_wired_alloc(void * cookie,bus_addr_t start,bus_addr_t end,bus_size_t size,bus_size_t align,bus_size_t boundary,int flags,bus_addr_t * addrp,bus_space_handle_t * bshp)279d8b2de51Sgdamore au_wired_alloc(void *cookie, bus_addr_t start, bus_addr_t end,
280d8b2de51Sgdamore     bus_size_t size, bus_size_t align, bus_size_t boundary, int flags,
281d8b2de51Sgdamore     bus_addr_t *addrp, bus_space_handle_t *bshp)
282d8b2de51Sgdamore {
283d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)cookie;
284d8b2de51Sgdamore 	vaddr_t addr;
285d8b2de51Sgdamore 	int err;
286d8b2de51Sgdamore 	paddr_t pa;
287d8b2de51Sgdamore 
288d8b2de51Sgdamore 	if (c->c_extent == NULL)
289d8b2de51Sgdamore 		panic("au_wired_alloc: extent map %s not avail", c->c_name);
290d8b2de51Sgdamore 
291d8b2de51Sgdamore 	if (start < c->c_start || ((start + size) > (c->c_start + c->c_size)))
292d8b2de51Sgdamore 		return EINVAL;
293d8b2de51Sgdamore 
294d8b2de51Sgdamore 	err = extent_alloc_subregion(c->c_extent, start, end, size,
295d8b2de51Sgdamore 	    align, boundary, EX_FAST | EX_NOWAIT, &addr);
296d8b2de51Sgdamore 	if (err)
297d8b2de51Sgdamore 		return err;
298d8b2de51Sgdamore 
299d8b2de51Sgdamore 	pa = c->c_pbase + (addr - c->c_start);
300d8b2de51Sgdamore 
301d8b2de51Sgdamore 	if (!mips3_wired_enter_region(addr, pa, size))
302d8b2de51Sgdamore 		return ENOMEM;
303d8b2de51Sgdamore 
304d8b2de51Sgdamore 	*bshp = addr;
305d8b2de51Sgdamore 	*addrp = addr;
306d8b2de51Sgdamore 	return 0;
307d8b2de51Sgdamore }
308d8b2de51Sgdamore 
309d8b2de51Sgdamore void
au_wired_free(void * cookie,bus_space_handle_t bsh,bus_size_t size)310d8b2de51Sgdamore au_wired_free(void *cookie, bus_space_handle_t bsh, bus_size_t size)
311d8b2de51Sgdamore {
312d8b2de51Sgdamore 
313d8b2de51Sgdamore 	/* unmap takes care of it all */
314d8b2de51Sgdamore 	au_wired_unmap(cookie, bsh, size, 1);
315d8b2de51Sgdamore }
316d8b2de51Sgdamore 
317d8b2de51Sgdamore inline void
au_wired_barrier(void * cookie,bus_space_handle_t bsh,bus_size_t o,bus_size_t l,int f)318d8b2de51Sgdamore au_wired_barrier(void *cookie, bus_space_handle_t bsh, bus_size_t o,
319d8b2de51Sgdamore     bus_size_t l, int f)
320d8b2de51Sgdamore {
321d8b2de51Sgdamore 
322d8b2de51Sgdamore 	if (f & BUS_SPACE_BARRIER_WRITE)
323d8b2de51Sgdamore 		wbflush();
324d8b2de51Sgdamore }
325d8b2de51Sgdamore 
326d8b2de51Sgdamore inline uint8_t
au_wired_r_1(void * v,bus_space_handle_t h,bus_size_t o)327d8b2de51Sgdamore au_wired_r_1(void *v, bus_space_handle_t h, bus_size_t o)
328d8b2de51Sgdamore {
329d8b2de51Sgdamore 
330d8b2de51Sgdamore 	return (*(volatile uint8_t *)(h + o));
331d8b2de51Sgdamore }
332d8b2de51Sgdamore 
333d8b2de51Sgdamore inline uint16_t
au_wired_r_2(void * v,bus_space_handle_t h,bus_size_t o)334d8b2de51Sgdamore au_wired_r_2(void *v, bus_space_handle_t h, bus_size_t o)
335d8b2de51Sgdamore {
336d8b2de51Sgdamore 	uint16_t		val = (*(volatile uint16_t *)(h + o));
337d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)v;
338d8b2de51Sgdamore 
339d8b2de51Sgdamore 	return (c->c_swswap ? bswap16(val) : val);
340d8b2de51Sgdamore }
341d8b2de51Sgdamore 
342d8b2de51Sgdamore inline uint32_t
au_wired_r_4(void * v,bus_space_handle_t h,bus_size_t o)343d8b2de51Sgdamore au_wired_r_4(void *v, bus_space_handle_t h, bus_size_t o)
344d8b2de51Sgdamore {
345d8b2de51Sgdamore 	uint32_t		val = (*(volatile uint32_t *)(h + o));
346d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)v;
347d8b2de51Sgdamore 
348d8b2de51Sgdamore 	return (c->c_swswap ? bswap32(val) : val);
349d8b2de51Sgdamore }
350d8b2de51Sgdamore 
351d8b2de51Sgdamore inline uint64_t
au_wired_r_8(void * v,bus_space_handle_t h,bus_size_t o)352d8b2de51Sgdamore au_wired_r_8(void *v, bus_space_handle_t h, bus_size_t o)
353d8b2de51Sgdamore {
354d8b2de51Sgdamore 	uint64_t		val = (*(volatile uint64_t *)(h + o));
355d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)v;
356d8b2de51Sgdamore 
357d8b2de51Sgdamore 	return (c->c_swswap ? bswap64(val) : val);
358d8b2de51Sgdamore }
359d8b2de51Sgdamore 
360d8b2de51Sgdamore inline void
au_wired_w_1(void * v,bus_space_handle_t h,bus_size_t o,uint8_t val)361d8b2de51Sgdamore au_wired_w_1(void *v, bus_space_handle_t h, bus_size_t o, uint8_t val)
362d8b2de51Sgdamore {
363d8b2de51Sgdamore 
364d8b2de51Sgdamore 	*(volatile uint8_t *)(h + o) = val;
365d8b2de51Sgdamore }
366d8b2de51Sgdamore 
367d8b2de51Sgdamore inline void
au_wired_w_2(void * v,bus_space_handle_t h,bus_size_t o,uint16_t val)368d8b2de51Sgdamore au_wired_w_2(void *v, bus_space_handle_t h, bus_size_t o, uint16_t val)
369d8b2de51Sgdamore {
370d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)v;
371d8b2de51Sgdamore 
372d8b2de51Sgdamore 	*(volatile uint16_t *)(h + o) = c->c_swswap ? bswap16(val) : val;
373d8b2de51Sgdamore }
374d8b2de51Sgdamore 
375d8b2de51Sgdamore inline void
au_wired_w_4(void * v,bus_space_handle_t h,bus_size_t o,uint32_t val)376d8b2de51Sgdamore au_wired_w_4(void *v, bus_space_handle_t h, bus_size_t o, uint32_t val)
377d8b2de51Sgdamore {
378d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)v;
379d8b2de51Sgdamore 
380d8b2de51Sgdamore 	*(volatile uint32_t *)(h + o) = c->c_swswap ? bswap32(val) : val;
381d8b2de51Sgdamore }
382d8b2de51Sgdamore 
383d8b2de51Sgdamore inline void
au_wired_w_8(void * v,bus_space_handle_t h,bus_size_t o,uint64_t val)384d8b2de51Sgdamore au_wired_w_8(void *v, bus_space_handle_t h, bus_size_t o, uint64_t val)
385d8b2de51Sgdamore {
386d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)v;
387d8b2de51Sgdamore 
388d8b2de51Sgdamore 	*(volatile uint64_t *)(h + o) = c->c_swswap ? bswap64(val) : val;
389d8b2de51Sgdamore }
390d8b2de51Sgdamore 
391d8b2de51Sgdamore inline uint16_t
au_wired_rs_2(void * v,bus_space_handle_t h,bus_size_t o)392d8b2de51Sgdamore au_wired_rs_2(void *v, bus_space_handle_t h, bus_size_t o)
393d8b2de51Sgdamore {
394d8b2de51Sgdamore 	uint16_t		val = (*(volatile uint16_t *)(h + o));
395d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)v;
396d8b2de51Sgdamore 
397d8b2de51Sgdamore 	return (c->c_hwswap ? bswap16(val) : val);
398d8b2de51Sgdamore }
399d8b2de51Sgdamore 
400d8b2de51Sgdamore inline uint32_t
au_wired_rs_4(void * v,bus_space_handle_t h,bus_size_t o)401d8b2de51Sgdamore au_wired_rs_4(void *v, bus_space_handle_t h, bus_size_t o)
402d8b2de51Sgdamore {
403d8b2de51Sgdamore 	uint32_t		val = (*(volatile uint32_t *)(h + o));
404d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)v;
405d8b2de51Sgdamore 
406d8b2de51Sgdamore 	return (c->c_hwswap ? bswap32(val) : val);
407d8b2de51Sgdamore }
408d8b2de51Sgdamore 
409d8b2de51Sgdamore inline uint64_t
au_wired_rs_8(void * v,bus_space_handle_t h,bus_size_t o)410d8b2de51Sgdamore au_wired_rs_8(void *v, bus_space_handle_t h, bus_size_t o)
411d8b2de51Sgdamore {
412d8b2de51Sgdamore 	uint64_t		val = (*(volatile uint64_t *)(h + o));
413d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)v;
414d8b2de51Sgdamore 
415d8b2de51Sgdamore 	return (c->c_hwswap ? bswap64(val) : val);
416d8b2de51Sgdamore }
417d8b2de51Sgdamore 
418d8b2de51Sgdamore inline void
au_wired_ws_2(void * v,bus_space_handle_t h,bus_size_t o,uint16_t val)419d8b2de51Sgdamore au_wired_ws_2(void *v, bus_space_handle_t h, bus_size_t o, uint16_t val)
420d8b2de51Sgdamore {
421d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)v;
422d8b2de51Sgdamore 
423d8b2de51Sgdamore 	*(volatile uint16_t *)(h + o) = c->c_hwswap ? bswap16(val) : val;
424d8b2de51Sgdamore }
425d8b2de51Sgdamore 
426d8b2de51Sgdamore inline void
au_wired_ws_4(void * v,bus_space_handle_t h,bus_size_t o,uint32_t val)427d8b2de51Sgdamore au_wired_ws_4(void *v, bus_space_handle_t h, bus_size_t o, uint32_t val)
428d8b2de51Sgdamore {
429d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)v;
430d8b2de51Sgdamore 
431d8b2de51Sgdamore 	*(volatile uint32_t *)(h + o) = c->c_hwswap ? bswap32(val) : val;
432d8b2de51Sgdamore }
433d8b2de51Sgdamore 
434d8b2de51Sgdamore inline void
au_wired_ws_8(void * v,bus_space_handle_t h,bus_size_t o,uint64_t val)435d8b2de51Sgdamore au_wired_ws_8(void *v, bus_space_handle_t h, bus_size_t o, uint64_t val)
436d8b2de51Sgdamore {
437d8b2de51Sgdamore 	au_wired_cookie_t	*c = (au_wired_cookie_t *)v;
438d8b2de51Sgdamore 
439d8b2de51Sgdamore 	*(volatile uint64_t *)(h + o) = c->c_hwswap ? bswap64(val) : val;
440d8b2de51Sgdamore }
441d8b2de51Sgdamore 
442d8b2de51Sgdamore #define	AU_WIRED_RM(TYPE,BYTES)						\
443d8b2de51Sgdamore void									\
444d8b2de51Sgdamore __CONCAT(au_wired_rm_,BYTES)(void *v,					\
445d8b2de51Sgdamore     bus_space_handle_t h, bus_size_t o, TYPE *dst, bus_size_t cnt)	\
446d8b2de51Sgdamore {									\
447d8b2de51Sgdamore 									\
448d8b2de51Sgdamore 	while (cnt-- > 0)						\
449d8b2de51Sgdamore 		*dst ++ = __CONCAT(au_wired_r_,BYTES)(v, h, o);		\
450d8b2de51Sgdamore }
451d8b2de51Sgdamore AU_WIRED_RM(uint8_t,1)
452d8b2de51Sgdamore AU_WIRED_RM(uint16_t,2)
453d8b2de51Sgdamore AU_WIRED_RM(uint32_t,4)
454d8b2de51Sgdamore AU_WIRED_RM(uint64_t,8)
455d8b2de51Sgdamore 
456d8b2de51Sgdamore #define	AU_WIRED_RMS(TYPE,BYTES)					\
457d8b2de51Sgdamore void									\
458d8b2de51Sgdamore __CONCAT(au_wired_rms_,BYTES)(void *v,					\
459d8b2de51Sgdamore     bus_space_handle_t h, bus_size_t o, TYPE *dst, bus_size_t cnt)	\
460d8b2de51Sgdamore {									\
461d8b2de51Sgdamore 									\
462d8b2de51Sgdamore 	while (cnt-- > 0) {						\
463d8b2de51Sgdamore 		wbflush();						\
464d8b2de51Sgdamore 		*dst++ = __CONCAT(au_wired_rs_,BYTES)(v, h, o);		\
465d8b2de51Sgdamore 	}								\
466d8b2de51Sgdamore }
467d8b2de51Sgdamore AU_WIRED_RMS(uint16_t,2)
468d8b2de51Sgdamore AU_WIRED_RMS(uint32_t,4)
469d8b2de51Sgdamore AU_WIRED_RMS(uint64_t,8)
470d8b2de51Sgdamore 
471d8b2de51Sgdamore #define AU_WIRED_RR(TYPE,BYTES)						\
472d8b2de51Sgdamore void									\
473d8b2de51Sgdamore __CONCAT(au_wired_rr_,BYTES)(void *v,					\
474d8b2de51Sgdamore     bus_space_handle_t h, bus_size_t o, TYPE *dst, bus_size_t cnt)	\
475d8b2de51Sgdamore {									\
476d8b2de51Sgdamore 									\
477d8b2de51Sgdamore 	while (cnt-- > 0) {						\
478d8b2de51Sgdamore 		*dst++ = __CONCAT(au_wired_r_,BYTES)(v, h, o);		\
479d8b2de51Sgdamore 		o += BYTES;						\
480d8b2de51Sgdamore 	}								\
481d8b2de51Sgdamore }
482d8b2de51Sgdamore AU_WIRED_RR(uint8_t,1)
483d8b2de51Sgdamore AU_WIRED_RR(uint16_t,2)
484d8b2de51Sgdamore AU_WIRED_RR(uint32_t,4)
485d8b2de51Sgdamore AU_WIRED_RR(uint64_t,8)
486d8b2de51Sgdamore 
487d8b2de51Sgdamore #define AU_WIRED_RRS(TYPE,BYTES)					\
488d8b2de51Sgdamore void									\
489d8b2de51Sgdamore __CONCAT(au_wired_rrs_,BYTES)(void *v,					\
490d8b2de51Sgdamore     bus_space_handle_t h, bus_size_t o, TYPE *dst, bus_size_t cnt)	\
491d8b2de51Sgdamore {									\
492d8b2de51Sgdamore 									\
493d8b2de51Sgdamore 	while (cnt-- > 0) {						\
494d8b2de51Sgdamore 		*dst++ = __CONCAT(au_wired_rs_,BYTES)(v, h, o);		\
495d8b2de51Sgdamore 		o += BYTES;						\
496d8b2de51Sgdamore 	}								\
497d8b2de51Sgdamore }
498d8b2de51Sgdamore AU_WIRED_RRS(uint16_t,2)
499d8b2de51Sgdamore AU_WIRED_RRS(uint32_t,4)
500d8b2de51Sgdamore AU_WIRED_RRS(uint64_t,8)
501d8b2de51Sgdamore 
502d8b2de51Sgdamore #define	AU_WIRED_WM(TYPE,BYTES)						\
503d8b2de51Sgdamore void									\
504d8b2de51Sgdamore __CONCAT(au_wired_wm_,BYTES)(void *v,					\
505d8b2de51Sgdamore     bus_space_handle_t h, bus_size_t o, const TYPE *src,		\
506d8b2de51Sgdamore     bus_size_t cnt)							\
507d8b2de51Sgdamore {									\
508d8b2de51Sgdamore 									\
509d8b2de51Sgdamore 	while (cnt-- > 0) {						\
510d8b2de51Sgdamore 		__CONCAT(au_wired_w_,BYTES)(v, h, o, *src++);		\
511d8b2de51Sgdamore 		wbflush();						\
512d8b2de51Sgdamore 	}								\
513d8b2de51Sgdamore }
514d8b2de51Sgdamore AU_WIRED_WM(uint8_t,1)
515d8b2de51Sgdamore AU_WIRED_WM(uint16_t,2)
516d8b2de51Sgdamore AU_WIRED_WM(uint32_t,4)
517d8b2de51Sgdamore AU_WIRED_WM(uint64_t,8)
518d8b2de51Sgdamore 
519d8b2de51Sgdamore #define	AU_WIRED_WMS(TYPE,BYTES)					\
520d8b2de51Sgdamore void									\
521d8b2de51Sgdamore __CONCAT(au_wired_wms_,BYTES)(void *v,					\
522d8b2de51Sgdamore     bus_space_handle_t h, bus_size_t o, const TYPE *src,		\
523d8b2de51Sgdamore     bus_size_t cnt)							\
524d8b2de51Sgdamore {									\
525d8b2de51Sgdamore 									\
526d8b2de51Sgdamore 	while (cnt-- > 0) {						\
527d8b2de51Sgdamore 		__CONCAT(au_wired_ws_,BYTES)(v, h, o, *src++);		\
528d8b2de51Sgdamore 		wbflush();						\
529d8b2de51Sgdamore 	}								\
530d8b2de51Sgdamore }
531d8b2de51Sgdamore AU_WIRED_WMS(uint16_t,2)
532d8b2de51Sgdamore AU_WIRED_WMS(uint32_t,4)
533d8b2de51Sgdamore AU_WIRED_WMS(uint64_t,8)
534d8b2de51Sgdamore 
535d8b2de51Sgdamore #define	AU_WIRED_WR(TYPE,BYTES)						\
536d8b2de51Sgdamore void									\
537d8b2de51Sgdamore __CONCAT(au_wired_wr_,BYTES)(void *v,					\
538d8b2de51Sgdamore     bus_space_handle_t h, bus_size_t o, const TYPE *src,		\
539d8b2de51Sgdamore     bus_size_t cnt)							\
540d8b2de51Sgdamore {									\
541d8b2de51Sgdamore 									\
542d8b2de51Sgdamore 	while (cnt-- > 0) {						\
543d8b2de51Sgdamore 		__CONCAT(au_wired_w_,BYTES)(v, h, o, *src++);		\
544d8b2de51Sgdamore 		o += BYTES;						\
545d8b2de51Sgdamore 	}								\
546d8b2de51Sgdamore }
547d8b2de51Sgdamore AU_WIRED_WR(uint8_t,1)
548d8b2de51Sgdamore AU_WIRED_WR(uint16_t,2)
549d8b2de51Sgdamore AU_WIRED_WR(uint32_t,4)
550d8b2de51Sgdamore AU_WIRED_WR(uint64_t,8)
551d8b2de51Sgdamore 
552d8b2de51Sgdamore #define	AU_WIRED_WRS(TYPE,BYTES)					\
553d8b2de51Sgdamore void									\
554d8b2de51Sgdamore __CONCAT(au_wired_wrs_,BYTES)(void *v,					\
555d8b2de51Sgdamore     bus_space_handle_t h, bus_size_t o, const TYPE *src,		\
556d8b2de51Sgdamore     bus_size_t cnt)							\
557d8b2de51Sgdamore {									\
558d8b2de51Sgdamore 									\
559d8b2de51Sgdamore 	while (cnt-- > 0) {						\
560d8b2de51Sgdamore 		__CONCAT(au_wired_ws_,BYTES)(v, h, o, *src++);		\
561d8b2de51Sgdamore 		o += BYTES;						\
562d8b2de51Sgdamore 	}								\
563d8b2de51Sgdamore }
564d8b2de51Sgdamore AU_WIRED_WRS(uint16_t,2)
565d8b2de51Sgdamore AU_WIRED_WRS(uint32_t,4)
566d8b2de51Sgdamore AU_WIRED_WRS(uint64_t,8)
567d8b2de51Sgdamore 
568d8b2de51Sgdamore #define	AU_WIRED_SM(TYPE,BYTES)						\
569d8b2de51Sgdamore void									\
570d8b2de51Sgdamore __CONCAT(au_wired_sm_,BYTES)(void *v,					\
571d8b2de51Sgdamore     bus_space_handle_t h, bus_size_t o, TYPE val,			\
572d8b2de51Sgdamore     bus_size_t cnt)							\
573d8b2de51Sgdamore {									\
574d8b2de51Sgdamore 									\
575d8b2de51Sgdamore 	while (cnt-- > 0) {						\
576d8b2de51Sgdamore 		__CONCAT(au_wired_w_,BYTES)(v, h, o, val);		\
577d8b2de51Sgdamore 		wbflush();						\
578d8b2de51Sgdamore 	}								\
579d8b2de51Sgdamore }
580d8b2de51Sgdamore AU_WIRED_SM(uint8_t,1)
581d8b2de51Sgdamore AU_WIRED_SM(uint16_t,2)
582d8b2de51Sgdamore AU_WIRED_SM(uint32_t,4)
583d8b2de51Sgdamore AU_WIRED_SM(uint64_t,8)
584d8b2de51Sgdamore 
585d8b2de51Sgdamore #define	AU_WIRED_SR(TYPE,BYTES)						\
586d8b2de51Sgdamore void									\
587d8b2de51Sgdamore __CONCAT(au_wired_sr_,BYTES)(void *v,					\
588d8b2de51Sgdamore     bus_space_handle_t h, bus_size_t o, TYPE val,			\
589d8b2de51Sgdamore     bus_size_t cnt)							\
590d8b2de51Sgdamore {									\
591d8b2de51Sgdamore 									\
592d8b2de51Sgdamore 	while (cnt-- > 0) {						\
593d8b2de51Sgdamore 		__CONCAT(au_wired_w_,BYTES)(v, h, o, val);		\
594d8b2de51Sgdamore 		o += BYTES;						\
595d8b2de51Sgdamore 	}								\
596d8b2de51Sgdamore }
597d8b2de51Sgdamore AU_WIRED_SR(uint8_t,1)
598d8b2de51Sgdamore AU_WIRED_SR(uint16_t,2)
599d8b2de51Sgdamore AU_WIRED_SR(uint32_t,4)
600d8b2de51Sgdamore AU_WIRED_SR(uint64_t,8)
601d8b2de51Sgdamore 
602d8b2de51Sgdamore 
603d8b2de51Sgdamore #define	AU_WIRED_C(TYPE,BYTES)						\
604d8b2de51Sgdamore void									\
605d8b2de51Sgdamore __CONCAT(au_wired_c_,BYTES)(void *v,					\
606d8b2de51Sgdamore     bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2,	\
607d8b2de51Sgdamore     bus_space_handle_t o2, bus_size_t cnt)				\
608d8b2de51Sgdamore {									\
609d8b2de51Sgdamore 	volatile TYPE *src, *dst;					\
610d8b2de51Sgdamore 	src = (volatile TYPE *)(h1 + o1);				\
611d8b2de51Sgdamore 	dst = (volatile TYPE *)(h2 + o2);				\
612d8b2de51Sgdamore 									\
613d8b2de51Sgdamore 	if (src >= dst) {						\
614d8b2de51Sgdamore 		while (cnt-- > 0)					\
615d8b2de51Sgdamore 			*dst++ = *src++;				\
616d8b2de51Sgdamore 	} else {							\
617d8b2de51Sgdamore 		src += cnt - 1;						\
618d8b2de51Sgdamore 		dst += cnt - 1;						\
619d8b2de51Sgdamore 		while (cnt-- > 0)					\
620d8b2de51Sgdamore 			*dst-- = *src--;				\
621d8b2de51Sgdamore 	}								\
622d8b2de51Sgdamore }
623d8b2de51Sgdamore AU_WIRED_C(uint8_t,1)
624d8b2de51Sgdamore AU_WIRED_C(uint16_t,2)
625d8b2de51Sgdamore AU_WIRED_C(uint32_t,4)
626d8b2de51Sgdamore AU_WIRED_C(uint64_t,8)
627d8b2de51Sgdamore 
628d8b2de51Sgdamore 
629d8b2de51Sgdamore void
au_wired_space_init(bus_space_tag_t bst,const char * name,paddr_t paddr,bus_addr_t start,bus_size_t size,int flags)630d8b2de51Sgdamore au_wired_space_init(bus_space_tag_t bst, const char *name,
631d8b2de51Sgdamore     paddr_t paddr, bus_addr_t start, bus_size_t size, int flags)
632d8b2de51Sgdamore {
633d8b2de51Sgdamore 	au_wired_cookie_t	*c;
634d8b2de51Sgdamore 
635*132587bfSthorpej 	c = kmem_zalloc(sizeof (struct au_wired_cookie), KM_SLEEP);
636d8b2de51Sgdamore 	c->c_pbase = paddr;
637d8b2de51Sgdamore 	c->c_name = name;
638d8b2de51Sgdamore 	c->c_start = start;
639d8b2de51Sgdamore 	c->c_size = size;
640d8b2de51Sgdamore 
641d8b2de51Sgdamore 	/* allocate extent manager */
64272e6205fSpara 	c->c_extent = extent_create(name, start, start + size,
64353524e44Schristos 	    (void *)c->c_exstore, sizeof (c->c_exstore), EX_NOWAIT);
644d8b2de51Sgdamore 	if (c->c_extent == NULL)
645d8b2de51Sgdamore 		panic("au_wired_space_init: %s: cannot create extent", name);
646d8b2de51Sgdamore 
647d8b2de51Sgdamore #if	_BYTE_ORDER == _BIG_ENDIAN
648d8b2de51Sgdamore 	if (flags & AU_WIRED_SPACE_LITTLE_ENDIAN) {
649d8b2de51Sgdamore 		if (flags & AU_WIRED_SPACE_SWAP_HW)
650d8b2de51Sgdamore 			c->c_hwswap = 1;
651d8b2de51Sgdamore 		else
652d8b2de51Sgdamore 			c->c_swswap = 1;
653d8b2de51Sgdamore 	}
654d8b2de51Sgdamore 
655d8b2de51Sgdamore #elif	_BYTE_ORDER == _LITTLE_ENDIAN
656d8b2de51Sgdamore 	if (flags & AU_WIRED_SPACE_BIG_ENDIAN) {
657d8b2de51Sgdamore 		if (flags & AU_WIRED_SPACE_SWAP_HW)
658d8b2de51Sgdamore 			c->c_hwswap = 1;
659d8b2de51Sgdamore 		else
660d8b2de51Sgdamore 			c->c_swswap = 1;
661d8b2de51Sgdamore 	}
662d8b2de51Sgdamore #endif
663d8b2de51Sgdamore 
664d8b2de51Sgdamore 	bst->bs_cookie = c;
665d8b2de51Sgdamore 	bst->bs_map = au_wired_map;
666d8b2de51Sgdamore 	bst->bs_unmap = au_wired_unmap;
667d8b2de51Sgdamore 	bst->bs_subregion = au_wired_subregion;
668d8b2de51Sgdamore 	bst->bs_translate = NULL;	/* we don't use these */
669d8b2de51Sgdamore 	bst->bs_get_window = NULL;	/* we don't use these */
670d8b2de51Sgdamore 	bst->bs_alloc = au_wired_alloc;
671d8b2de51Sgdamore 	bst->bs_free = au_wired_free;
672d8b2de51Sgdamore 	bst->bs_vaddr = au_wired_vaddr;
673d8b2de51Sgdamore 	bst->bs_mmap = au_wired_mmap;
674d8b2de51Sgdamore 	bst->bs_barrier = au_wired_barrier;
675d8b2de51Sgdamore 	bst->bs_r_1 = au_wired_r_1;
676d8b2de51Sgdamore 	bst->bs_w_1 = au_wired_w_1;
677d8b2de51Sgdamore 	bst->bs_r_2 = au_wired_r_2;
678d8b2de51Sgdamore 	bst->bs_r_4 = au_wired_r_4;
679d8b2de51Sgdamore 	bst->bs_r_8 = au_wired_r_8;
680d8b2de51Sgdamore 	bst->bs_w_2 = au_wired_w_2;
681d8b2de51Sgdamore 	bst->bs_w_4 = au_wired_w_4;
682d8b2de51Sgdamore 	bst->bs_w_8 = au_wired_w_8;
683d8b2de51Sgdamore 	bst->bs_rm_1 = au_wired_rm_1;
684d8b2de51Sgdamore 	bst->bs_rm_2 = au_wired_rm_2;
685d8b2de51Sgdamore 	bst->bs_rm_4 = au_wired_rm_4;
686d8b2de51Sgdamore 	bst->bs_rm_8 = au_wired_rm_8;
687d8b2de51Sgdamore 	bst->bs_rr_1 = au_wired_rr_1;
688d8b2de51Sgdamore 	bst->bs_rr_2 = au_wired_rr_2;
689d8b2de51Sgdamore 	bst->bs_rr_4 = au_wired_rr_4;
690d8b2de51Sgdamore 	bst->bs_rr_8 = au_wired_rr_8;
691d8b2de51Sgdamore 	bst->bs_wm_1 = au_wired_wm_1;
692d8b2de51Sgdamore 	bst->bs_wm_2 = au_wired_wm_2;
693d8b2de51Sgdamore 	bst->bs_wm_4 = au_wired_wm_4;
694d8b2de51Sgdamore 	bst->bs_wm_8 = au_wired_wm_8;
695d8b2de51Sgdamore 	bst->bs_wr_1 = au_wired_wr_1;
696d8b2de51Sgdamore 	bst->bs_wr_2 = au_wired_wr_2;
697d8b2de51Sgdamore 	bst->bs_wr_4 = au_wired_wr_4;
698d8b2de51Sgdamore 	bst->bs_wr_8 = au_wired_wr_8;
699d8b2de51Sgdamore 	bst->bs_sm_1 = au_wired_sm_1;
700d8b2de51Sgdamore 	bst->bs_sm_2 = au_wired_sm_2;
701d8b2de51Sgdamore 	bst->bs_sm_4 = au_wired_sm_4;
702d8b2de51Sgdamore 	bst->bs_sm_8 = au_wired_sm_8;
703d8b2de51Sgdamore 	bst->bs_sr_1 = au_wired_sr_1;
704d8b2de51Sgdamore 	bst->bs_sr_2 = au_wired_sr_2;
705d8b2de51Sgdamore 	bst->bs_sr_4 = au_wired_sr_4;
706d8b2de51Sgdamore 	bst->bs_sr_8 = au_wired_sr_8;
707d8b2de51Sgdamore 	bst->bs_c_1 = au_wired_c_1;
708d8b2de51Sgdamore 	bst->bs_c_2 = au_wired_c_2;
709d8b2de51Sgdamore 	bst->bs_c_4 = au_wired_c_4;
710d8b2de51Sgdamore 	bst->bs_c_8 = au_wired_c_8;
711d8b2de51Sgdamore 
712d8b2de51Sgdamore 	bst->bs_rs_1 = au_wired_r_1;
713d8b2de51Sgdamore 	bst->bs_rs_2 = au_wired_rs_2;
714d8b2de51Sgdamore 	bst->bs_rs_4 = au_wired_rs_4;
715d8b2de51Sgdamore 	bst->bs_rs_8 = au_wired_rs_8;
716d8b2de51Sgdamore 	bst->bs_rms_1 = au_wired_rm_1;
717d8b2de51Sgdamore 	bst->bs_rms_2 = au_wired_rms_2;
718d8b2de51Sgdamore 	bst->bs_rms_4 = au_wired_rms_4;
719d8b2de51Sgdamore 	bst->bs_rms_8 = au_wired_rms_8;
720d8b2de51Sgdamore 	bst->bs_rrs_1 = au_wired_rr_1;
721d8b2de51Sgdamore 	bst->bs_rrs_2 = au_wired_rrs_2;
722d8b2de51Sgdamore 	bst->bs_rrs_4 = au_wired_rrs_4;
723d8b2de51Sgdamore 	bst->bs_rrs_8 = au_wired_rrs_8;
724d8b2de51Sgdamore 	bst->bs_ws_1 = au_wired_w_1;
725d8b2de51Sgdamore 	bst->bs_ws_2 = au_wired_ws_2;
726d8b2de51Sgdamore 	bst->bs_ws_4 = au_wired_ws_4;
727d8b2de51Sgdamore 	bst->bs_ws_8 = au_wired_ws_8;
728d8b2de51Sgdamore 	bst->bs_wms_1 = au_wired_wm_1;
729d8b2de51Sgdamore 	bst->bs_wms_2 = au_wired_wms_2;
730d8b2de51Sgdamore 	bst->bs_wms_4 = au_wired_wms_4;
731d8b2de51Sgdamore 	bst->bs_wms_8 = au_wired_wms_8;
732d8b2de51Sgdamore 	bst->bs_wrs_1 = au_wired_wr_1;
733d8b2de51Sgdamore 	bst->bs_wrs_2 = au_wired_wrs_2;
734d8b2de51Sgdamore 	bst->bs_wrs_4 = au_wired_wrs_4;
735d8b2de51Sgdamore 	bst->bs_wrs_8 = au_wired_wrs_8;
736d8b2de51Sgdamore }
737