bus.h revision 120375
180708Sjake/*-
286228Stmm * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
380708Sjake * All rights reserved.
480708Sjake *
586228Stmm * This code is derived from software contributed to The NetBSD Foundation
686228Stmm * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
786228Stmm * NASA Ames Research Center.
886228Stmm *
980708Sjake * Redistribution and use in source and binary forms, with or without
1080708Sjake * modification, are permitted provided that the following conditions
1180708Sjake * are met:
1280708Sjake * 1. Redistributions of source code must retain the above copyright
1380708Sjake *    notice, this list of conditions and the following disclaimer.
1480708Sjake * 2. Redistributions in binary form must reproduce the above copyright
1580708Sjake *    notice, this list of conditions and the following disclaimer in the
1680708Sjake *    documentation and/or other materials provided with the distribution.
1786228Stmm * 3. All advertising materials mentioning features or use of this software
1886228Stmm *    must display the following acknowledgement:
1986228Stmm *	This product includes software developed by the NetBSD
2086228Stmm *	Foundation, Inc. and its contributors.
2186228Stmm * 4. Neither the name of The NetBSD Foundation nor the names of its
2286228Stmm *    contributors may be used to endorse or promote products derived
2386228Stmm *    from this software without specific prior written permission.
2480708Sjake *
2586228Stmm * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2686228Stmm * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2786228Stmm * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2886228Stmm * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2986228Stmm * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
3086228Stmm * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
3186228Stmm * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
3286228Stmm * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
3386228Stmm * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3486228Stmm * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3586228Stmm * POSSIBILITY OF SUCH DAMAGE.
3686228Stmm */
3786228Stmm/*
3886228Stmm * Copyright (c) 1997-1999 Eduardo E. Horvath. All rights reserved.
3986228Stmm * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
4086228Stmm * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
4180708Sjake *
4286228Stmm * Redistribution and use in source and binary forms, with or without
4386228Stmm * modification, are permitted provided that the following conditions
4486228Stmm * are met:
4586228Stmm * 1. Redistributions of source code must retain the above copyright
4686228Stmm *    notice, this list of conditions and the following disclaimer.
4786228Stmm * 2. Redistributions in binary form must reproduce the above copyright
4886228Stmm *    notice, this list of conditions and the following disclaimer in the
4986228Stmm *    documentation and/or other materials provided with the distribution.
5086228Stmm * 3. All advertising materials mentioning features or use of this software
5186228Stmm *    must display the following acknowledgement:
5286228Stmm *      This product includes software developed by Christopher G. Demetriou
5386228Stmm *	for the NetBSD Project.
5486228Stmm * 4. The name of the author may not be used to endorse or promote products
5586228Stmm *    derived from this software without specific prior written permission
5686228Stmm *
5786228Stmm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
5886228Stmm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
5986228Stmm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
6086228Stmm * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
6186228Stmm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
6286228Stmm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
6386228Stmm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
6486228Stmm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
6586228Stmm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
6686228Stmm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
6786228Stmm *
6886228Stmm * 	from: NetBSD: bus.h,v 1.28 2001/07/19 15:32:19 thorpej Exp
6986228Stmm *	and
7086228Stmm *	from: FreeBSD: src/sys/alpha/include/bus.h,v 1.9 2001/01/09
7186228Stmm *
7280708Sjake * $FreeBSD: head/sys/sparc64/include/bus.h 120375 2003-09-23 08:22:34Z nyan $
7380708Sjake */
7480708Sjake
7580708Sjake#ifndef	_MACHINE_BUS_H_
7680708Sjake#define	_MACHINE_BUS_H_
7780708Sjake
7890615Stmm#ifdef BUS_SPACE_DEBUG
7990615Stmm#include <sys/ktr.h>
8090615Stmm#endif
8190615Stmm
8286228Stmm#include <machine/cpufunc.h>
8390615Stmm#include <machine/upa.h>
8480708Sjake
8586228Stmm/*
8686228Stmm * UPA and SBUS spaces are non-cached and big endian
8786228Stmm * (except for RAM and PROM)
8886228Stmm *
8986228Stmm * PCI spaces are non-cached and little endian
9086228Stmm */
9186228Stmm#define	UPA_BUS_SPACE		0
9286228Stmm#define	SBUS_BUS_SPACE		1
9386228Stmm#define	PCI_CONFIG_BUS_SPACE	2
9486228Stmm#define	PCI_IO_BUS_SPACE	3
9586228Stmm#define	PCI_MEMORY_BUS_SPACE	4
9686228Stmm#define	LAST_BUS_SPACE		5
9786228Stmm
9886228Stmmextern int bus_type_asi[];
9986228Stmmextern int bus_stream_asi[];
10086228Stmm
10186228Stmm#define __BUS_SPACE_HAS_STREAM_METHODS	1
10286228Stmm
10386228Stmm/*
10486228Stmm * Bus address and size types
10586228Stmm */
10686228Stmmtypedef	u_long		bus_space_handle_t;
10786228Stmmtypedef int		bus_type_t;
10886228Stmmtypedef u_long		bus_addr_t;
10986228Stmmtypedef u_long		bus_size_t;
11086228Stmm
11186228Stmm#define BUS_SPACE_MAXSIZE_24BIT	0xFFFFFF
11286228Stmm#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
113111524Smux#define BUS_SPACE_MAXSIZE	0xFFFFFFFFFFFFFFFF
11486228Stmm#define BUS_SPACE_MAXADDR_24BIT	0xFFFFFF
11586228Stmm#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
11686228Stmm#define BUS_SPACE_MAXADDR	0xFFFFFFFF
11786228Stmm
11886228Stmm#define BUS_SPACE_UNRESTRICTED	(~0UL)
11986228Stmm
12086228Stmm/*
12186228Stmm * Access methods for bus resources and address space.
12286228Stmm */
12386228Stmmtypedef struct bus_space_tag	*bus_space_tag_t;
12486228Stmm
12586228Stmmstruct bus_space_tag {
126108815Stmm	void		*bst_cookie;
127108815Stmm	bus_space_tag_t	bst_parent;
128108815Stmm	int		bst_type;
12986228Stmm
130108815Stmm	void		(*bst_bus_barrier)(bus_space_tag_t, bus_space_handle_t,
13193052Stmm	    bus_size_t, bus_size_t, int);
13286228Stmm};
13386228Stmm
13486228Stmm/*
13586228Stmm * Bus space function prototypes.
13686228Stmm */
13793052Stmmstatic void bus_space_barrier(bus_space_tag_t, bus_space_handle_t, bus_size_t,
13893052Stmm    bus_size_t, int);
139108917Sjakestatic int bus_space_subregion(bus_space_tag_t, bus_space_handle_t,
140108917Sjake    bus_size_t, bus_size_t, bus_space_handle_t *);
141120375Snyan
142111347Sobrien/*
143120375Snyan * Map a region of device bus space into CPU virtual address space.
144120375Snyan */
145120375Snyan
146120375Snyanstatic __inline int bus_space_map(bus_space_tag_t t, bus_addr_t addr,
147120375Snyan				  bus_size_t size, int flags,
148120375Snyan				  bus_space_handle_t *bshp);
149120375Snyan
150120375Snyanstatic __inline int
151120375Snyanbus_space_map(bus_space_tag_t t __unused, bus_addr_t addr,
152120375Snyan	      bus_size_t size __unused, int flags __unused,
153120375Snyan	      bus_space_handle_t *bshp)
154120375Snyan{
155120375Snyan
156120375Snyan	*bshp = addr;
157120375Snyan	return (0);
158120375Snyan}
159120375Snyan
160120375Snyan/*
161111347Sobrien * Unmap a region of device bus space.
162111347Sobrien */
163111347Sobrienstatic __inline void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh,
164111347Sobrien				     bus_size_t size);
16586228Stmm
166111347Sobrienstatic __inline void
167111347Sobrienbus_space_unmap(bus_space_tag_t t __unused, bus_space_handle_t bsh __unused,
168111347Sobrien		bus_size_t size __unused)
169111347Sobrien{
170111347Sobrien}
171111347Sobrien
17286228Stmm/* This macro finds the first "upstream" implementation of method `f' */
17393052Stmm#define _BS_CALL(t,f)							\
17493052Stmm	while (t->f == NULL)						\
175108815Stmm		t = t->bst_parent;						\
17686228Stmm	return (*(t)->f)
17786228Stmm
17893052Stmmstatic __inline void
17993052Stmmbus_space_barrier(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
18093052Stmm    bus_size_t s, int f)
18186228Stmm{
182108815Stmm	_BS_CALL(t, bst_bus_barrier)(t, h, o, s, f);
18386228Stmm}
18486228Stmm
185108917Sjakestatic __inline int
186108917Sjakebus_space_subregion(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
187108917Sjake    bus_size_t s, bus_space_handle_t *hp)
188108917Sjake{
189108917Sjake	*hp = h + o;
190108917Sjake	return (0);
191108917Sjake}
192108917Sjake
19386228Stmm/* flags for bus space map functions */
19486228Stmm#define BUS_SPACE_MAP_CACHEABLE		0x0001
19586228Stmm#define BUS_SPACE_MAP_LINEAR		0x0002
19686228Stmm#define BUS_SPACE_MAP_READONLY		0x0004
19786228Stmm#define BUS_SPACE_MAP_PREFETCHABLE	0x0008
19886228Stmm/* placeholders for bus functions... */
19986228Stmm#define BUS_SPACE_MAP_BUS1		0x0100
20086228Stmm#define BUS_SPACE_MAP_BUS2		0x0200
20186228Stmm#define BUS_SPACE_MAP_BUS3		0x0400
20286228Stmm#define BUS_SPACE_MAP_BUS4		0x0800
20386228Stmm
20486228Stmm/* flags for bus_space_barrier() */
20586228Stmm#define	BUS_SPACE_BARRIER_READ		0x01	/* force read barrier */
20686228Stmm#define	BUS_SPACE_BARRIER_WRITE		0x02	/* force write barrier */
20786228Stmm
20890615Stmm#ifdef BUS_SPACE_DEBUG
20990615Stmm#define	KTR_BUS				KTR_CT2
21090615Stmm#define	BUS_HANDLE_MIN			UPA_MEMSTART
21190615Stmm#define	__BUS_DEBUG_ACCESS(h, o, desc, sz) do {				\
21290615Stmm	CTR4(KTR_BUS, "bus space: %s %d: handle %#lx, offset %#lx",	\
21390615Stmm	    (desc), (sz), (h), (o));					\
21490615Stmm	if ((h) + (o) < BUS_HANDLE_MIN)					\
21590615Stmm		panic("bus space access at %#lx out of range",		\
21690615Stmm		    (h) + (o));						\
21790615Stmm} while (0)
21890615Stmm#else
21990615Stmm#define	__BUS_DEBUG_ACCESS(h, o, desc, sz)
22090615Stmm#endif
22190615Stmm
222104304Sjakestatic __inline uint8_t
223104304Sjakebus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
224104304Sjake{
22586228Stmm
226104304Sjake	__BUS_DEBUG_ACCESS(h, o, "read", 1);
227108815Stmm	return (lduba_nc((caddr_t)(h + o), bus_type_asi[t->bst_type]));
228104304Sjake}
22986228Stmm
230104304Sjakestatic __inline uint16_t
231104304Sjakebus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
232104304Sjake{
23386228Stmm
234104304Sjake	__BUS_DEBUG_ACCESS(h, o, "read", 2);
235108815Stmm	return (lduha_nc((caddr_t)(h + o), bus_type_asi[t->bst_type]));
236104304Sjake}
23786228Stmm
238104304Sjakestatic __inline uint32_t
239104304Sjakebus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
240104304Sjake{
24186228Stmm
242104304Sjake	__BUS_DEBUG_ACCESS(h, o, "read", 4);
243108815Stmm	return (lduwa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type]));
244104304Sjake}
24586228Stmm
246104304Sjakestatic __inline uint64_t
247104304Sjakebus_space_read_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
248104304Sjake{
24986228Stmm
250104304Sjake	__BUS_DEBUG_ACCESS(h, o, "read", 8);
251108815Stmm	return (ldxa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type]));
252104304Sjake}
25386228Stmm
254104304Sjakestatic __inline void
255104304Sjakebus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
256104304Sjake    uint8_t *a, size_t c)
257104304Sjake{
25886228Stmm
259104304Sjake	while (c-- > 0)
260104304Sjake		*a++ = bus_space_read_1(t, h, o);
261104304Sjake}
26286228Stmm
263104304Sjakestatic __inline void
264104304Sjakebus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
265104304Sjake    uint16_t *a, size_t c)
266104304Sjake{
26786228Stmm
268104304Sjake	while (c-- > 0)
269104304Sjake		*a++ = bus_space_read_2(t, h, o);
270104304Sjake}
27186228Stmm
272104304Sjakestatic __inline void
273104304Sjakebus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
274104304Sjake    uint32_t *a, size_t c)
275104304Sjake{
27686228Stmm
277104304Sjake	while (c-- > 0)
278104304Sjake		*a++ = bus_space_read_4(t, h, o);
279104304Sjake}
28086228Stmm
281104304Sjakestatic __inline void
282104304Sjakebus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
283104304Sjake    uint64_t *a, size_t c)
284104304Sjake{
28586228Stmm
286104304Sjake	while (c-- > 0)
287104304Sjake		*a++ = bus_space_read_8(t, h, o);
288104304Sjake}
28986228Stmm
290104304Sjakestatic __inline void
291104304Sjakebus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
292104304Sjake    uint8_t v)
293104304Sjake{
29486228Stmm
295104304Sjake	__BUS_DEBUG_ACCESS(h, o, "write", 1);
296108815Stmm	stba_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v);
297104304Sjake}
29886228Stmm
299104304Sjakestatic __inline void
300104304Sjakebus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
301104304Sjake    uint16_t v)
302104304Sjake{
30386228Stmm
304104304Sjake	__BUS_DEBUG_ACCESS(h, o, "write", 2);
305108815Stmm	stha_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v);
306104304Sjake}
30786228Stmm
30893052Stmmstatic __inline void
309104304Sjakebus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
310104304Sjake    uint32_t v)
311104304Sjake{
312104304Sjake
313104304Sjake	__BUS_DEBUG_ACCESS(h, o, "write", 4);
314108815Stmm	stwa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v);
315104304Sjake}
316104304Sjake
317104304Sjakestatic __inline void
318104304Sjakebus_space_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
319104304Sjake    uint64_t v)
320104304Sjake{
321104304Sjake
322104304Sjake	__BUS_DEBUG_ACCESS(h, o, "write", 8);
323108815Stmm	stxa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v);
324104304Sjake}
325104304Sjake
326104304Sjakestatic __inline void
327104304Sjakebus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
328104304Sjake    uint8_t *a, size_t c)
329104304Sjake{
330104304Sjake
331104304Sjake	while (c-- > 0)
332104304Sjake		bus_space_write_1(t, h, o, *a++);
333104304Sjake}
334104304Sjake
335104304Sjakestatic __inline void
336104304Sjakebus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
337104304Sjake    uint16_t *a, size_t c)
338104304Sjake{
339104304Sjake
340104304Sjake	while (c-- > 0)
341104304Sjake		bus_space_write_2(t, h, o, *a++);
342104304Sjake}
343104304Sjake
344104304Sjakestatic __inline void
345104304Sjakebus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
346104304Sjake    uint32_t *a, size_t c)
347104304Sjake{
348104304Sjake
349104304Sjake	while (c-- > 0)
350104304Sjake		bus_space_write_4(t, h, o, *a++);
351104304Sjake}
352104304Sjake
353104304Sjakestatic __inline void
354104304Sjakebus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
355104304Sjake    uint64_t *a, size_t c)
356104304Sjake{
357104304Sjake
358104304Sjake	while (c-- > 0)
359104304Sjake		bus_space_write_8(t, h, o, *a++);
360104304Sjake}
361104304Sjake
362104304Sjakestatic __inline void
363104304Sjakebus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
364104304Sjake    uint8_t v, size_t c)
365104304Sjake{
366104304Sjake
367104304Sjake	while (c-- > 0)
368104304Sjake		bus_space_write_1(t, h, o, v);
369104304Sjake}
370104304Sjake
371104304Sjakestatic __inline void
372104304Sjakebus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
373104304Sjake    uint16_t v, size_t c)
374104304Sjake{
375104304Sjake
376104304Sjake	while (c-- > 0)
377104304Sjake		bus_space_write_2(t, h, o, v);
378104304Sjake}
379104304Sjake
380104304Sjakestatic __inline void
381104304Sjakebus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
382104304Sjake    uint32_t v, size_t c)
383104304Sjake{
384104304Sjake
385104304Sjake	while (c-- > 0)
386104304Sjake		bus_space_write_4(t, h, o, v);
387104304Sjake}
388104304Sjake
389104304Sjakestatic __inline void
390104304Sjakebus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
391104304Sjake    uint64_t v, size_t c)
392104304Sjake{
393104304Sjake
394104304Sjake	while (c-- > 0)
395104304Sjake		bus_space_write_8(t, h, o, v);
396104304Sjake}
397104304Sjake
398104304Sjakestatic __inline void
39993052Stmmbus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
40093052Stmm    u_int8_t *a, bus_size_t c)
40186228Stmm{
40286228Stmm	for (; c; a++, c--, o++)
40386228Stmm		*a = bus_space_read_1(t, h, o);
40486228Stmm}
40586228Stmm
40693052Stmmstatic __inline void
40793052Stmmbus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
40893052Stmm    u_int16_t *a, bus_size_t c)
40986228Stmm{
41086228Stmm	for (; c; a++, c--, o+=2)
41186228Stmm		*a = bus_space_read_2(t, h, o);
41286228Stmm}
41386228Stmm
41493052Stmmstatic __inline void
41593052Stmmbus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
41693052Stmm    u_int32_t *a, bus_size_t c)
41786228Stmm{
41886228Stmm	for (; c; a++, c--, o+=4)
41986228Stmm		*a = bus_space_read_4(t, h, o);
42086228Stmm}
42186228Stmm
42293052Stmmstatic __inline void
42393052Stmmbus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
42493052Stmm    u_int64_t *a, bus_size_t c)
42586228Stmm{
42686228Stmm	for (; c; a++, c--, o+=8)
42786228Stmm		*a = bus_space_read_8(t, h, o);
42886228Stmm}
42986228Stmm
43093052Stmmstatic __inline void
43193052Stmmbus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
43293052Stmm    const u_int8_t *a, bus_size_t c)
43386228Stmm{
43486228Stmm	for (; c; a++, c--, o++)
43586228Stmm		bus_space_write_1(t, h, o, *a);
43686228Stmm}
43786228Stmm
43893052Stmmstatic __inline void
43993052Stmmbus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
44093052Stmm    const u_int16_t *a, bus_size_t c)
44186228Stmm{
44286228Stmm	for (; c; a++, c--, o+=2)
44386228Stmm		bus_space_write_2(t, h, o, *a);
44486228Stmm}
44586228Stmm
44693052Stmmstatic __inline void
44793052Stmmbus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
44893052Stmm    const u_int32_t *a, bus_size_t c)
44986228Stmm{
45086228Stmm	for (; c; a++, c--, o+=4)
45186228Stmm		bus_space_write_4(t, h, o, *a);
45286228Stmm}
45386228Stmm
45493052Stmmstatic __inline void
45593052Stmmbus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
45693052Stmm    const u_int64_t *a, bus_size_t c)
45786228Stmm{
45886228Stmm	for (; c; a++, c--, o+=8)
45986228Stmm		bus_space_write_8(t, h, o, *a);
46086228Stmm}
46186228Stmm
46293052Stmmstatic __inline void
46393052Stmmbus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
46493052Stmm    const u_int8_t v, bus_size_t c)
46586228Stmm{
46686228Stmm	for (; c; c--, o++)
46786228Stmm		bus_space_write_1(t, h, o, v);
46886228Stmm}
46986228Stmm
47093052Stmmstatic __inline void
47193052Stmmbus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
47293052Stmm    const u_int16_t v, bus_size_t c)
47386228Stmm{
47486228Stmm	for (; c; c--, o+=2)
47586228Stmm		bus_space_write_2(t, h, o, v);
47686228Stmm}
47786228Stmm
47893052Stmmstatic __inline void
47993052Stmmbus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
48093052Stmm    const u_int32_t v, bus_size_t c)
48186228Stmm{
48286228Stmm	for (; c; c--, o+=4)
48386228Stmm		bus_space_write_4(t, h, o, v);
48486228Stmm}
48586228Stmm
48693052Stmmstatic __inline void
48793052Stmmbus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
48893052Stmm    const u_int64_t v, bus_size_t c)
48986228Stmm{
49086228Stmm	for (; c; c--, o+=8)
49186228Stmm		bus_space_write_8(t, h, o, v);
49286228Stmm}
49386228Stmm
49493052Stmmstatic __inline void
49593052Stmmbus_space_copy_region_1(bus_space_tag_t t, bus_space_handle_t h1,
49693052Stmm    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
49786228Stmm{
49886228Stmm	for (; c; c--, o1++, o2++)
49986228Stmm	    bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2));
50086228Stmm}
50186228Stmm
50293052Stmmstatic __inline void
50393052Stmmbus_space_copy_region_2(bus_space_tag_t t, bus_space_handle_t h1,
50493052Stmm    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
50586228Stmm{
50686228Stmm	for (; c; c--, o1+=2, o2+=2)
50786228Stmm	    bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2));
50886228Stmm}
50986228Stmm
51093052Stmmstatic __inline void
51193052Stmmbus_space_copy_region_4(bus_space_tag_t t, bus_space_handle_t h1,
51293052Stmm    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
51386228Stmm{
51486228Stmm	for (; c; c--, o1+=4, o2+=4)
51586228Stmm	    bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2));
51686228Stmm}
51786228Stmm
51893052Stmmstatic __inline void
51993052Stmmbus_space_copy_region_8(bus_space_tag_t t, bus_space_handle_t h1,
52093052Stmm    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
52186228Stmm{
52286228Stmm	for (; c; c--, o1+=8, o2+=8)
52386228Stmm	    bus_space_write_8(t, h1, o1, bus_space_read_8(t, h2, o2));
52486228Stmm}
52586228Stmm
526104304Sjakestatic __inline uint8_t
527104304Sjakebus_space_read_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
528104304Sjake{
52986228Stmm
530104304Sjake	__BUS_DEBUG_ACCESS(h, o, "read stream", 1);
531108815Stmm	return (lduba_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type]));
532104304Sjake}
53386228Stmm
534104304Sjakestatic __inline uint16_t
535104304Sjakebus_space_read_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
536104304Sjake{
53786228Stmm
538104304Sjake	__BUS_DEBUG_ACCESS(h, o, "read stream", 2);
539108815Stmm	return (lduha_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type]));
540104304Sjake}
54186228Stmm
542104304Sjakestatic __inline uint32_t
543104304Sjakebus_space_read_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
544104304Sjake{
54586228Stmm
546104304Sjake	__BUS_DEBUG_ACCESS(h, o, "read stream", 4);
547108815Stmm	return (lduwa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type]));
548104304Sjake}
54986228Stmm
550104304Sjakestatic __inline uint64_t
551104304Sjakebus_space_read_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
552104304Sjake{
55386228Stmm
554104304Sjake	__BUS_DEBUG_ACCESS(h, o, "read stream", 8);
555108815Stmm	return (ldxa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type]));
556104304Sjake}
55786228Stmm
558104304Sjakestatic __inline void
559104304Sjakebus_space_read_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h,
560104304Sjake    bus_size_t o, uint8_t *a, size_t c)
561104304Sjake{
56286228Stmm
563104304Sjake	while (c-- > 0)
564104304Sjake		*a++ = bus_space_read_stream_1(t, h, o);
565104304Sjake}
56686228Stmm
567104304Sjakestatic __inline void
568104304Sjakebus_space_read_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h,
569104304Sjake    bus_size_t o, uint16_t *a, size_t c)
570104304Sjake{
57186228Stmm
572104304Sjake	while (c-- > 0)
573104304Sjake		*a++ = bus_space_read_stream_2(t, h, o);
574104304Sjake}
57586228Stmm
576104304Sjakestatic __inline void
577104304Sjakebus_space_read_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h,
578104304Sjake    bus_size_t o, uint32_t *a, size_t c)
579104304Sjake{
58086228Stmm
581104304Sjake	while (c-- > 0)
582104304Sjake		*a++ = bus_space_read_stream_4(t, h, o);
583104304Sjake}
58486228Stmm
585104304Sjakestatic __inline void
586104304Sjakebus_space_read_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h,
587104304Sjake    bus_size_t o, uint64_t *a, size_t c)
588104304Sjake{
58986228Stmm
590104304Sjake	while (c-- > 0)
591104304Sjake		*a++ = bus_space_read_stream_8(t, h, o);
592104304Sjake}
59386228Stmm
594104304Sjakestatic __inline void
595104304Sjakebus_space_write_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
596104304Sjake    uint8_t v)
597104304Sjake{
59886228Stmm
599104304Sjake	__BUS_DEBUG_ACCESS(h, o, "write stream", 1);
600108815Stmm	stba_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v);
601104304Sjake}
60286228Stmm
603104304Sjakestatic __inline void
604104304Sjakebus_space_write_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
605104304Sjake    uint16_t v)
606104304Sjake{
60786228Stmm
608104304Sjake	__BUS_DEBUG_ACCESS(h, o, "write stream", 2);
609108815Stmm	stha_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v);
610104304Sjake}
61186228Stmm
61293052Stmmstatic __inline void
613104304Sjakebus_space_write_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
614104304Sjake    uint32_t v)
615104304Sjake{
616104304Sjake
617104304Sjake	__BUS_DEBUG_ACCESS(h, o, "write stream", 4);
618108815Stmm	stwa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v);
619104304Sjake}
620104304Sjake
621104304Sjakestatic __inline void
622104304Sjakebus_space_write_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
623104304Sjake    uint64_t v)
624104304Sjake{
625104304Sjake
626104304Sjake	__BUS_DEBUG_ACCESS(h, o, "write stream", 8);
627108815Stmm	stxa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v);
628104304Sjake}
629104304Sjake
630104304Sjakestatic __inline void
631104304Sjakebus_space_write_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h,
632111383Sobrien    bus_size_t o, const uint8_t *a, size_t c)
633104304Sjake{
634104304Sjake
635104304Sjake	while (c-- > 0)
636104304Sjake		bus_space_write_stream_1(t, h, o, *a++);
637104304Sjake}
638104304Sjake
639104304Sjakestatic __inline void
640104304Sjakebus_space_write_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h,
641111353Sobrien    bus_size_t o, const uint16_t *a, size_t c)
642104304Sjake{
643104304Sjake
644104304Sjake	while (c-- > 0)
645104304Sjake		bus_space_write_stream_2(t, h, o, *a++);
646104304Sjake}
647104304Sjake
648104304Sjakestatic __inline void
649104304Sjakebus_space_write_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h,
650111383Sobrien    bus_size_t o, const uint32_t *a, size_t c)
651104304Sjake{
652104304Sjake
653104304Sjake	while (c-- > 0)
654104304Sjake		bus_space_write_stream_4(t, h, o, *a++);
655104304Sjake}
656104304Sjake
657104304Sjakestatic __inline void
658104304Sjakebus_space_write_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h,
659111383Sobrien    bus_size_t o, const uint64_t *a, size_t c)
660104304Sjake{
661104304Sjake
662104304Sjake	while (c-- > 0)
663104304Sjake		bus_space_write_stream_8(t, h, o, *a++);
664104304Sjake}
665104304Sjake
666104304Sjakestatic __inline void
667104304Sjakebus_space_set_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h,
668104304Sjake    bus_size_t o, uint8_t v, size_t c)
669104304Sjake{
670104304Sjake
671104304Sjake	while (c-- > 0)
672104304Sjake		bus_space_write_stream_1(t, h, o, v);
673104304Sjake}
674104304Sjake
675104304Sjakestatic __inline void
676104304Sjakebus_space_set_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h,
677104304Sjake    bus_size_t o, uint16_t v, size_t c)
678104304Sjake{
679104304Sjake
680104304Sjake	while (c-- > 0)
681104304Sjake		bus_space_write_stream_2(t, h, o, v);
682104304Sjake}
683104304Sjake
684104304Sjakestatic __inline void
685104304Sjakebus_space_set_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h,
686104304Sjake    bus_size_t o, uint32_t v, size_t c)
687104304Sjake{
688104304Sjake
689104304Sjake	while (c-- > 0)
690104304Sjake		bus_space_write_stream_4(t, h, o, v);
691104304Sjake}
692104304Sjake
693104304Sjakestatic __inline void
694104304Sjakebus_space_set_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h,
695104304Sjake    bus_size_t o, uint64_t v, size_t c)
696104304Sjake{
697104304Sjake
698104304Sjake	while (c-- > 0)
699104304Sjake		bus_space_write_stream_8(t, h, o, v);
700104304Sjake}
701104304Sjake
702104304Sjakestatic __inline void
70393052Stmmbus_space_read_region_stream_1(bus_space_tag_t t, bus_space_handle_t h,
70493052Stmm    bus_size_t o, u_int8_t *a, bus_size_t c)
70586228Stmm{
70686228Stmm	for (; c; a++, c--, o++)
70786228Stmm		*a = bus_space_read_stream_1(t, h, o);
70886228Stmm}
70986228Stmm
71093052Stmmstatic __inline void
71193052Stmmbus_space_read_region_stream_2(bus_space_tag_t t, bus_space_handle_t h,
71293052Stmm    bus_size_t o, u_int16_t *a, bus_size_t c)
71386228Stmm{
71486228Stmm	for (; c; a++, c--, o+=2)
71586228Stmm		*a = bus_space_read_stream_2(t, h, o);
71686228Stmm}
71786228Stmm
71893052Stmmstatic __inline void
71993052Stmmbus_space_read_region_stream_4(bus_space_tag_t t, bus_space_handle_t h,
72093052Stmm    bus_size_t o, u_int32_t *a, bus_size_t c)
72186228Stmm{
72286228Stmm	for (; c; a++, c--, o+=4)
72386228Stmm		*a = bus_space_read_stream_4(t, h, o);
72486228Stmm}
72586228Stmm
72693052Stmmstatic __inline void
72793052Stmmbus_space_read_region_stream_8(bus_space_tag_t t, bus_space_handle_t h,
72893052Stmm    bus_size_t o, u_int64_t *a, bus_size_t c)
72986228Stmm{
73086228Stmm	for (; c; a++, c--, o+=8)
73186228Stmm		*a = bus_space_read_stream_8(t, h, o);
73286228Stmm}
73386228Stmm
73493052Stmmstatic __inline void
73593052Stmmbus_space_write_region_stream_1(bus_space_tag_t t, bus_space_handle_t h,
73693052Stmm    bus_size_t o, const u_int8_t *a, bus_size_t c)
73786228Stmm{
73886228Stmm	for (; c; a++, c--, o++)
73986228Stmm		bus_space_write_stream_1(t, h, o, *a);
74086228Stmm}
74186228Stmm
74293052Stmmstatic __inline void
74393052Stmmbus_space_write_region_stream_2(bus_space_tag_t t, bus_space_handle_t h,
74493052Stmm    bus_size_t o, const u_int16_t *a, bus_size_t c)
74586228Stmm{
74686228Stmm	for (; c; a++, c--, o+=2)
74786228Stmm		bus_space_write_stream_2(t, h, o, *a);
74886228Stmm}
74986228Stmm
75093052Stmmstatic __inline void
75193052Stmmbus_space_write_region_stream_4(bus_space_tag_t t, bus_space_handle_t h,
75293052Stmm    bus_size_t o, const u_int32_t *a, bus_size_t c)
75386228Stmm{
75486228Stmm	for (; c; a++, c--, o+=4)
75586228Stmm		bus_space_write_stream_4(t, h, o, *a);
75686228Stmm}
75786228Stmm
75893052Stmmstatic __inline void
75993052Stmmbus_space_write_region_stream_8(bus_space_tag_t t, bus_space_handle_t h,
76093052Stmm    bus_size_t o, const u_int64_t *a, bus_size_t c)
76186228Stmm{
76286228Stmm	for (; c; a++, c--, o+=8)
76386228Stmm		bus_space_write_stream_8(t, h, o, *a);
76486228Stmm}
76586228Stmm
76693052Stmmstatic __inline void
76793052Stmmbus_space_set_region_stream_1(bus_space_tag_t t, bus_space_handle_t h,
76893052Stmm    bus_size_t o, const u_int8_t v, bus_size_t c)
76986228Stmm{
77086228Stmm	for (; c; c--, o++)
77186228Stmm		bus_space_write_stream_1(t, h, o, v);
77286228Stmm}
77386228Stmm
77493052Stmmstatic __inline void
77593052Stmmbus_space_set_region_stream_2(bus_space_tag_t t, bus_space_handle_t h,
77693052Stmm    bus_size_t o, const u_int16_t v, bus_size_t c)
77786228Stmm{
77886228Stmm	for (; c; c--, o+=2)
77986228Stmm		bus_space_write_stream_2(t, h, o, v);
78086228Stmm}
78186228Stmm
78293052Stmmstatic __inline void
78393052Stmmbus_space_set_region_stream_4(bus_space_tag_t t, bus_space_handle_t h,
78493052Stmm    bus_size_t o, const u_int32_t v, bus_size_t c)
78586228Stmm{
78686228Stmm	for (; c; c--, o+=4)
78786228Stmm		bus_space_write_stream_4(t, h, o, v);
78886228Stmm}
78986228Stmm
79093052Stmmstatic __inline void
79193052Stmmbus_space_set_region_stream_8(bus_space_tag_t t, bus_space_handle_t h,
79293052Stmm    bus_size_t o, const u_int64_t v, bus_size_t c)
79386228Stmm{
79486228Stmm	for (; c; c--, o+=8)
79586228Stmm		bus_space_write_stream_8(t, h, o, v);
79686228Stmm}
79786228Stmm
79893052Stmmstatic __inline void
79993052Stmmbus_space_copy_region_stream_1(bus_space_tag_t t, bus_space_handle_t h1,
80093052Stmm    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
80186228Stmm{
80286228Stmm	for (; c; c--, o1++, o2++)
80386228Stmm	    bus_space_write_stream_1(t, h1, o1, bus_space_read_stream_1(t, h2,
80486228Stmm		o2));
80586228Stmm}
80686228Stmm
80793052Stmmstatic __inline void
80893052Stmmbus_space_copy_region_stream_2(bus_space_tag_t t, bus_space_handle_t h1,
80993052Stmm    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
81086228Stmm{
81186228Stmm	for (; c; c--, o1+=2, o2+=2)
81286228Stmm	    bus_space_write_stream_2(t, h1, o1, bus_space_read_stream_2(t, h2,
81386228Stmm		o2));
81486228Stmm}
81586228Stmm
81693052Stmmstatic __inline void
81793052Stmmbus_space_copy_region_stream_4(bus_space_tag_t t, bus_space_handle_t h1,
81893052Stmm    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
81986228Stmm{
82086228Stmm	for (; c; c--, o1+=4, o2+=4)
82186228Stmm	    bus_space_write_stream_4(t, h1, o1, bus_space_read_stream_4(t, h2,
82286228Stmm		o2));
82386228Stmm}
82486228Stmm
82593052Stmmstatic __inline void
82693052Stmmbus_space_copy_region_stream_8(bus_space_tag_t t, bus_space_handle_t h1,
82793052Stmm    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
82886228Stmm{
82986228Stmm	for (; c; c--, o1+=8, o2+=8)
83086228Stmm	    bus_space_write_stream_8(t, h1, o1, bus_space_read_8(t, h2, o2));
83186228Stmm}
83286228Stmm
833116659Sjmgstatic __inline int
834116659Sjmgbus_space_peek_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
835116659Sjmg	u_int8_t *a)
836116659Sjmg{
837116659Sjmg
838116659Sjmg	__BUS_DEBUG_ACCESS(h, o, "peek", 1);
839116659Sjmg	return (fasword8(bus_type_asi[t->bst_type], (caddr_t)(h + o), a));
840116659Sjmg}
841116659Sjmg
842116659Sjmgstatic __inline int
843116659Sjmgbus_space_peek_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
844116659Sjmg	u_int16_t *a)
845116659Sjmg{
846116659Sjmg
847116659Sjmg	__BUS_DEBUG_ACCESS(h, o, "peek", 2);
848116659Sjmg	return (fasword16(bus_type_asi[t->bst_type], (caddr_t)(h + o), a));
849116659Sjmg}
850116659Sjmg
851116659Sjmgstatic __inline int
852116659Sjmgbus_space_peek_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
853116659Sjmg	u_int32_t *a)
854116659Sjmg{
855116659Sjmg
856116659Sjmg	__BUS_DEBUG_ACCESS(h, o, "peek", 4);
857116659Sjmg	return (fasword32(bus_type_asi[t->bst_type], (caddr_t)(h + o), a));
858116659Sjmg}
859116659Sjmg
86086228Stmm/* Back-compat functions for old ISA drivers */
86186228Stmmextern bus_space_tag_t isa_io_bt;
86286228Stmmextern bus_space_handle_t isa_io_hdl;
86386228Stmmextern bus_space_tag_t isa_mem_bt;
86486228Stmmextern bus_space_handle_t isa_mem_hdl;
86586228Stmm
86686228Stmm#define inb(o)		bus_space_read_1(isa_io_bt, isa_io_hdl, o)
86786228Stmm#define inw(o)		bus_space_read_2(isa_io_bt, isa_io_hdl, o)
86886228Stmm#define inl(o)		bus_space_read_4(isa_io_bt, isa_io_hdl, o)
86990615Stmm#define outb(o, v)	bus_space_write_1(isa_io_bt, isa_io_hdl, o, v)
87086228Stmm#define outw(o, v)	bus_space_write_2(isa_io_bt, isa_io_hdl, o, v)
87186228Stmm#define outl(o, v)	bus_space_write_4(isa_io_bt, isa_io_hdl, o, v)
87286228Stmm
87386228Stmm#define readb(o)	bus_space_read_1(isa_mem_bt, isa_mem_hdl, o)
87486228Stmm#define readw(o)	bus_space_read_2(isa_mem_bt, isa_mem_hdl, o)
87586228Stmm#define readl(o)	bus_space_read_4(isa_mem_bt, isa_mem_hdl, o)
87686228Stmm#define writeb(o, v)	bus_space_write_1(isa_mem_bt, isa_mem_hdl, o, v)
87786228Stmm#define writew(o, v)	bus_space_write_2(isa_mem_bt, isa_mem_hdl, o, v)
87886228Stmm#define writel(o, v)	bus_space_write_4(isa_mem_bt, isa_mem_hdl, o, v)
87986228Stmm
88086228Stmm#define insb(o, a, c) \
88186228Stmm	bus_space_read_multi_1(isa_io_bt, isa_io_hdl, o, (void*)a, c)
88286228Stmm#define insw(o, a, c) \
88386228Stmm	bus_space_read_multi_2(isa_io_bt, isa_io_hdl, o, (void*)a, c)
88486228Stmm#define insl(o, a, c) \
88586228Stmm	bus_space_read_multi_4(isa_io_bt, isa_io_hdl, o, (void*)a, c)
88686228Stmm#define outsb(o, a, c) \
88786228Stmm	bus_space_write_multi_1(isa_io_bt, isa_io_hdl, o, (void*)a, c)
88886228Stmm#define outsw(o, a, c) \
88986228Stmm	bus_space_write_multi_2(isa_io_bt, isa_io_hdl, o, (void*)a, c)
89086228Stmm#define outsl(o, a, c) \
89186228Stmm	bus_space_write_multi_4(isa_io_bt, isa_io_hdl, o, (void*)a, c)
89286228Stmm
89386228Stmm#define memcpy_fromio(d, s, c) \
89486228Stmm	bus_space_read_region_1(isa_mem_bt, isa_mem_hdl, s, d, c)
89586228Stmm#define memcpy_toio(d, s, c) \
89686228Stmm	bus_space_write_region_1(isa_mem_bt, isa_mem_hdl, d, s, c)
89786228Stmm#define memcpy_io(d, s, c) \
89886228Stmm	bus_space_copy_region_1(isa_mem_bt, isa_mem_hdl, s, isa_mem_hdl, d, c)
89986228Stmm#define memset_io(d, v, c) \
90086228Stmm	bus_space_set_region_1(isa_mem_bt, isa_mem_hdl, d, v, c)
90186228Stmm#define memsetw_io(d, v, c) \
90286228Stmm	bus_space_set_region_2(isa_mem_bt, isa_mem_hdl, d, v, c)
90386228Stmm
90486228Stmmstatic __inline void
90586228Stmmmemsetw(void *d, int val, size_t size)
90686228Stmm{
90786228Stmm    u_int16_t *sp = d;
90886228Stmm
90986228Stmm    while (size--)
91086228Stmm	*sp++ = val;
91186228Stmm}
91286228Stmm
91386228Stmm/* DMA support */
91486228Stmm
91586228Stmm/*
91686228Stmm * Flags used in various bus DMA methods.
91786228Stmm */
91886228Stmm#define	BUS_DMA_WAITOK		0x000	/* safe to sleep (pseudo-flag) */
91986228Stmm#define	BUS_DMA_NOWAIT		0x001	/* not safe to sleep */
92086228Stmm#define	BUS_DMA_ALLOCNOW	0x002	/* perform resource allocation now */
921115416Shmp#define	BUS_DMA_COHERENT	0x004	/* hint: map memory in a coherent way */
922118081Smux#define	BUS_DMA_ZERO		0x008	/* allocate zero'ed memory */
92390615Stmm#define	BUS_DMA_BUS1		0x010
92486228Stmm#define	BUS_DMA_BUS2		0x020
92586228Stmm#define	BUS_DMA_BUS3		0x040
92686228Stmm#define	BUS_DMA_BUS4		0x080
92786228Stmm
928117390Stmm/* The following two flags are non-standard. */
929117390Stmm#define	BUS_DMA_NOWRITE		0x100
930117390Stmm#define	BUS_DMA_NOCACHE		0x200
93186228Stmm
93286228Stmm/* Forwards needed by prototypes below. */
93386228Stmmstruct mbuf;
93486228Stmmstruct uio;
93586228Stmm
936115343Sscottltypedef int bus_dmasync_op_t;
937113347Smux#define	BUS_DMASYNC_PREREAD	1
938113347Smux#define	BUS_DMASYNC_POSTREAD	2
939113347Smux#define	BUS_DMASYNC_PREWRITE	4
940113347Smux#define	BUS_DMASYNC_POSTWRITE	8
94186228Stmm
94286228Stmm/*
94386228Stmm * A function that returns 1 if the address cannot be accessed by
94486228Stmm * a device and 0 if it can be.
94586228Stmm */
94686228Stmmtypedef int bus_dma_filter_t(void *, bus_addr_t);
94786228Stmm
94886228Stmmtypedef struct bus_dma_tag	*bus_dma_tag_t;
94986228Stmmtypedef struct bus_dmamap	*bus_dmamap_t;
95086228Stmm
95186228Stmmstruct bus_dma_segment {
95286228Stmm	bus_addr_t	ds_addr;	/* DVMA address */
95386228Stmm	bus_size_t	ds_len;		/* length of transfer */
95486228Stmm};
95586228Stmmtypedef struct bus_dma_segment	bus_dma_segment_t;
95686228Stmm
95786228Stmm/*
95886228Stmm * A function that processes a successfully loaded dma map or an error
95986228Stmm * from a delayed load map.
96086228Stmm */
96186228Stmmtypedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int);
96286228Stmm
96386228Stmm/*
964104486Ssam * Like bus_dmamap_callback but includes map size in bytes.  This is
965104486Ssam * defined as a separate interface to maintain compatiiblity for users
966104486Ssam * of bus_dmamap_callback_t--at some point these interfaces should be merged.
967104486Ssam */
968104486Ssamtypedef void bus_dmamap_callback2_t(void *, bus_dma_segment_t *, int, bus_size_t, int);
969104486Ssam
970104486Ssam/*
971117126Sscottl * A function that performs driver-specific syncronization on behalf of
972117126Sscottl * busdma.
973117126Sscottl */
974117126Sscottltypedef enum {
975117126Sscottl        BUS_DMA_LOCK    = 0x01,
976117126Sscottl        BUS_DMA_UNLOCK  = 0x02,
977117126Sscottl} bus_dma_lock_op_t;
978117126Sscottl
979117126Sscottltypedef void bus_dma_lock_t(void *, bus_dma_lock_op_t);
980117126Sscottl
981117126Sscottl/*
982116541Stmm * Method table for a bus_dma_tag.
983116541Stmm */
984116541Stmmstruct bus_dma_methods {
985116541Stmm	int	(*dm_dmamap_create)(bus_dma_tag_t, int, bus_dmamap_t *);
986116541Stmm	int	(*dm_dmamap_destroy)(bus_dma_tag_t, bus_dmamap_t);
987116541Stmm	int	(*dm_dmamap_load)(bus_dma_tag_t, bus_dmamap_t, void *,
988116541Stmm	    bus_size_t, bus_dmamap_callback_t *, void *, int);
989116541Stmm	int	(*dm_dmamap_load_mbuf)(bus_dma_tag_t, bus_dmamap_t,
990116541Stmm	    struct mbuf *, bus_dmamap_callback2_t *, void *, int);
991116541Stmm	int	(*dm_dmamap_load_uio)(bus_dma_tag_t, bus_dmamap_t, struct uio *,
992116541Stmm	    bus_dmamap_callback2_t *, void *, int);
993116541Stmm	void	(*dm_dmamap_unload)(bus_dma_tag_t, bus_dmamap_t);
994116541Stmm	void	(*dm_dmamap_sync)(bus_dma_tag_t, bus_dmamap_t,
995116541Stmm	    bus_dmasync_op_t);
996116541Stmm	int	(*dm_dmamem_alloc)(bus_dma_tag_t, void **, int, bus_dmamap_t *);
997116541Stmm	void	(*dm_dmamem_free)(bus_dma_tag_t, void *, bus_dmamap_t);
998116541Stmm};
999116541Stmm
1000116541Stmm/*
1001116541Stmm * bus_dma_tag_t
100286228Stmm *
1003116541Stmm * A machine-dependent opaque type describing the implementation of
1004116541Stmm * DMA for a given bus.
100586228Stmm */
100686228Stmmstruct bus_dma_tag {
1007108815Stmm	void		*dt_cookie;		/* cookie used in the guts */
1008108815Stmm	bus_dma_tag_t	dt_parent;
1009108815Stmm	bus_size_t	dt_alignment;
1010108815Stmm	bus_size_t	dt_boundary;
1011108815Stmm	bus_addr_t	dt_lowaddr;
1012108815Stmm	bus_addr_t	dt_highaddr;
1013108815Stmm	bus_dma_filter_t	*dt_filter;
1014108815Stmm	void		*dt_filterarg;
1015108815Stmm	bus_size_t	dt_maxsize;
1016108815Stmm	int		dt_nsegments;
1017108815Stmm	bus_size_t	dt_maxsegsz;
1018108815Stmm	int		dt_flags;
1019108815Stmm	int		dt_ref_count;
1020108815Stmm	int		dt_map_count;
1021117126Sscottl	bus_dma_lock_t	*dt_lockfunc;
1022117126Sscottl	void *		*dt_lockfuncarg;
102386228Stmm
1024116541Stmm	struct bus_dma_methods	*dt_mt;
102586228Stmm};
102686228Stmm
102786228Stmmint bus_dma_tag_create(bus_dma_tag_t, bus_size_t, bus_size_t, bus_addr_t,
102893052Stmm    bus_addr_t, bus_dma_filter_t *, void *, bus_size_t, int, bus_size_t,
1029117126Sscottl    int, bus_dma_lock_t *, void *, bus_dma_tag_t *);
103086228Stmm
103186228Stmmint bus_dma_tag_destroy(bus_dma_tag_t);
103286228Stmm
103386228Stmm#define	bus_dmamap_create(t, f, p)					\
1034116541Stmm	((t)->dt_mt->dm_dmamap_create((t), (f), (p)))
103586228Stmm#define	bus_dmamap_destroy(t, p)					\
1036116541Stmm	((t)->dt_mt->dm_dmamap_destroy((t), (p)))
103786228Stmm#define	bus_dmamap_load(t, m, p, s, cb, cba, f)				\
1038116541Stmm	((t)->dt_mt->dm_dmamap_load((t), (m), (p), (s), (cb), (cba), (f)))
1039116541Stmm#define	bus_dmamap_load_mbuf(t, m, mb, cb, cba, f)			\
1040116541Stmm	((t)->dt_mt->dm_dmamap_load_mbuf((t), (m), (mb), (cb), (cba), (f)))
1041116541Stmm#define	bus_dmamap_load_uio(t, m, ui, cb, cba, f)			\
1042116541Stmm	((t)->dt_mt->dm_dmamap_load_uio((t), (m), (ui), (cb), (cba), (f)))
104386228Stmm#define	bus_dmamap_unload(t, p)						\
1044116541Stmm	((t)->dt_mt->dm_dmamap_unload((t), (p)))
104586228Stmm#define	bus_dmamap_sync(t, m, op)					\
1046116541Stmm	((t)->dt_mt->dm_dmamap_sync((t), (m), (op)))
104786228Stmm#define	bus_dmamem_alloc(t, v, f, m)					\
1048116541Stmm	((t)->dt_mt->dm_dmamem_alloc((t), (v), (f), (m)))
104986228Stmm#define	bus_dmamem_free(t, v, m)					\
1050116541Stmm	((t)->dt_mt->dm_dmamem_free((t), (v), (m)))
105186228Stmm
1052117126Sscottl/*
1053117126Sscottl * Generic helper function for manipulating mutexes.
1054117126Sscottl */
1055117126Sscottlvoid busdma_lock_mutex(void *arg, bus_dma_lock_op_t op);
105680708Sjake#endif /* !_MACHINE_BUS_H_ */
1057