bus.h revision 1.4
11.4Smatt/*	$NetBSD: bus.h,v 1.4 2000/11/27 08:53:54 matt Exp $	*/
21.1Snonaka/*	$OpenBSD: bus.h,v 1.1 1997/10/13 10:53:42 pefo Exp $	*/
31.1Snonaka
41.1Snonaka/*-
51.1Snonaka * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
61.1Snonaka * All rights reserved.
71.1Snonaka *
81.1Snonaka * This code is derived from software contributed to The NetBSD Foundation
91.1Snonaka * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
101.1Snonaka * NASA Ames Research Center.
111.1Snonaka *
121.1Snonaka * Redistribution and use in source and binary forms, with or without
131.1Snonaka * modification, are permitted provided that the following conditions
141.1Snonaka * are met:
151.1Snonaka * 1. Redistributions of source code must retain the above copyright
161.1Snonaka *    notice, this list of conditions and the following disclaimer.
171.1Snonaka * 2. Redistributions in binary form must reproduce the above copyright
181.1Snonaka *    notice, this list of conditions and the following disclaimer in the
191.1Snonaka *    documentation and/or other materials provided with the distribution.
201.1Snonaka * 3. All advertising materials mentioning features or use of this software
211.1Snonaka *    must display the following acknowledgement:
221.1Snonaka *	This product includes software developed by the NetBSD
231.1Snonaka *	Foundation, Inc. and its contributors.
241.1Snonaka * 4. Neither the name of The NetBSD Foundation nor the names of its
251.1Snonaka *    contributors may be used to endorse or promote products derived
261.1Snonaka *    from this software without specific prior written permission.
271.1Snonaka *
281.1Snonaka * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
291.1Snonaka * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
301.1Snonaka * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
311.1Snonaka * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
321.1Snonaka * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
331.1Snonaka * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
341.1Snonaka * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
351.1Snonaka * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
361.1Snonaka * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
371.1Snonaka * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
381.1Snonaka * POSSIBILITY OF SUCH DAMAGE.
391.1Snonaka */
401.1Snonaka
411.1Snonaka/*
421.1Snonaka * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
431.1Snonaka * Copyright (c) 1996 Jason R. Thorpe.  All rights reserved.
441.1Snonaka * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
451.1Snonaka *
461.1Snonaka * Redistribution and use in source and binary forms, with or without
471.1Snonaka * modification, are permitted provided that the following conditions
481.1Snonaka * are met:
491.1Snonaka * 1. Redistributions of source code must retain the above copyright
501.1Snonaka *    notice, this list of conditions and the following disclaimer.
511.1Snonaka * 2. Redistributions in binary form must reproduce the above copyright
521.1Snonaka *    notice, this list of conditions and the following disclaimer in the
531.1Snonaka *    documentation and/or other materials provided with the distribution.
541.1Snonaka * 3. All advertising materials mentioning features or use of this software
551.1Snonaka *    must display the following acknowledgement:
561.1Snonaka *      This product includes software developed by Christopher G. Demetriou
571.1Snonaka *	for the NetBSD Project.
581.1Snonaka * 4. The name of the author may not be used to endorse or promote products
591.1Snonaka *    derived from this software without specific prior written permission
601.1Snonaka *
611.1Snonaka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
621.1Snonaka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
631.1Snonaka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
641.1Snonaka * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
651.1Snonaka * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
661.1Snonaka * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
671.1Snonaka * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
681.1Snonaka * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
691.1Snonaka * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
701.1Snonaka * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
711.1Snonaka */
721.1Snonaka
731.1Snonaka/*
741.1Snonaka * Copyright (c) 1997 Per Fogelstrom.  All rights reserved.
751.1Snonaka * Copyright (c) 1996 Niklas Hallqvist.  All rights reserved.
761.1Snonaka *
771.1Snonaka * Redistribution and use in source and binary forms, with or without
781.1Snonaka * modification, are permitted provided that the following conditions
791.1Snonaka * are met:
801.1Snonaka * 1. Redistributions of source code must retain the above copyright
811.1Snonaka *    notice, this list of conditions and the following disclaimer.
821.1Snonaka * 2. Redistributions in binary form must reproduce the above copyright
831.1Snonaka *    notice, this list of conditions and the following disclaimer in the
841.1Snonaka *    documentation and/or other materials provided with the distribution.
851.1Snonaka * 3. All advertising materials mentioning features or use of this software
861.1Snonaka *    must display the following acknowledgement:
871.1Snonaka *      This product includes software developed by Christopher G. Demetriou
881.1Snonaka *	for the NetBSD Project.
891.1Snonaka * 4. The name of the author may not be used to endorse or promote products
901.1Snonaka *    derived from this software without specific prior written permission
911.1Snonaka *
921.1Snonaka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
931.1Snonaka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
941.1Snonaka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
951.1Snonaka * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
961.1Snonaka * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
971.1Snonaka * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
981.1Snonaka * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
991.1Snonaka * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1001.1Snonaka * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
1011.1Snonaka * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1021.1Snonaka */
1031.1Snonaka
1041.1Snonaka#ifndef _PREP_BUS_H_
1051.1Snonaka#define _PREP_BUS_H_
1061.1Snonaka
1071.1Snonaka#include <machine/pio.h>
1081.1Snonaka
1091.1Snonaka/*
1101.1Snonaka * Values for the Be bus space tag, not to be used directly by MI code.
1111.1Snonaka */
1121.1Snonaka#define	PREP_BUS_SPACE_IO	0x80000000	/* i/o space */
1131.1Snonaka#define PREP_BUS_SPACE_MEM	0xC0000000	/* mem space */
1141.1Snonaka
1151.1Snonaka/*
1161.1Snonaka * Address conversion as seen from a PCI master.
1171.1Snonaka */
1181.1Snonaka#define MPC105_DIRECT_MAPPED_SPACE	0x80000000
1191.1Snonaka#define PHYS_TO_PCI_MEM(x)	((x) | MPC105_DIRECT_MAPPED_SPACE)
1201.1Snonaka#define PCI_MEM_TO_PHYS(x)	((x) & ~MPC105_DIRECT_MAPPED_SPACE)
1211.1Snonaka
1221.1Snonaka/*
1231.1Snonaka * Bus access types.
1241.1Snonaka */
1251.1Snonakatypedef u_int32_t bus_addr_t;
1261.1Snonakatypedef u_int32_t bus_size_t;
1271.1Snonakatypedef	u_int32_t bus_space_handle_t;
1281.4Smatttypedef	const struct prep_bus_space {
1291.4Smatt	u_int32_t pbs_type;
1301.4Smatt	bus_addr_t pbs_base;
1311.4Smatt	bus_addr_t pbs_limit;
1321.4Smatt} *bus_space_tag_t;
1331.4Smatt
1341.4Smattextern const struct prep_bus_space prep_io_space_tag;
1351.4Smattextern const struct prep_bus_space prep_isa_io_space_tag;
1361.4Smattextern const struct prep_bus_space prep_mem_space_tag;
1371.4Smattextern const struct prep_bus_space prep_isa_mem_space_tag;
1381.1Snonaka
1391.1Snonaka#define BUS_SPACE_MAP_CACHEABLE         0x01
1401.1Snonaka#define BUS_SPACE_MAP_LINEAR            0x02
1411.1Snonaka#define	BUS_SPACE_MAP_PREFETCHABLE	0x04
1421.1Snonaka
1431.1Snonaka#ifdef __STDC__
1441.1Snonaka#define CAT(a,b)	a##b
1451.1Snonaka#define CAT3(a,b,c)	a##b##c
1461.1Snonaka#else
1471.1Snonaka#define CAT(a,b)	a/**/b
1481.1Snonaka#define CAT3(a,b,c)	a/**/b/**/c
1491.1Snonaka#endif
1501.1Snonaka
1511.1Snonaka/*
1521.1Snonaka * Access methods for bus resources
1531.1Snonaka */
1541.1Snonaka
1551.1Snonaka#define	__BUS_SPACE_HAS_STREAM_METHODS
1561.1Snonaka
1571.1Snonaka/*
1581.1Snonaka *	int bus_space_map  __P((bus_space_tag_t t, bus_addr_t addr,
1591.1Snonaka *	    bus_size_t size, int flags, bus_space_handle_t *bshp));
1601.1Snonaka *
1611.1Snonaka * Map a region of bus space.
1621.1Snonaka */
1631.1Snonaka
1641.2Snonakaint	prep_memio_map __P((bus_space_tag_t t, bus_addr_t addr,
1651.2Snonaka	    bus_size_t size, int flags, bus_space_handle_t *bshp));
1661.2Snonaka
1671.2Snonaka#define bus_space_map(t, a, s, f, hp)					\
1681.2Snonaka    prep_memio_map((t), (a), (s), (f), (hp))
1691.1Snonaka
1701.1Snonaka/*
1711.1Snonaka *	int bus_space_unmap __P((bus_space_tag_t t,
1721.1Snonaka *	    bus_space_handle_t bsh, bus_size_t size));
1731.1Snonaka *
1741.1Snonaka * Unmap a region of bus space.
1751.1Snonaka */
1761.1Snonaka
1771.2Snonakavoid	prep_memio_unmap __P((bus_space_tag_t t, bus_space_handle_t bsh,
1781.2Snonaka	    bus_size_t size));
1791.2Snonaka
1801.2Snonaka#define bus_space_unmap(t, h, s)					\
1811.2Snonaka    prep_memio_unmap((t), (h), (s))
1821.1Snonaka
1831.1Snonaka/*
1841.1Snonaka *	int bus_space_subregion __P((bus_space_tag_t t,
1851.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset, bus_size_t size,
1861.1Snonaka *	    bus_space_handle_t *nbshp));
1871.1Snonaka *
1881.1Snonaka * Get a new handle for a subregion of an already-mapped area of bus space.
1891.1Snonaka */
1901.1Snonaka
1911.2Snonaka#define bus_space_subregion(t, h, o, s, hp)				\
1921.2Snonaka    ((*(hp) = (h) + (o)), 0)
1931.1Snonaka
1941.1Snonaka/*
1951.1Snonaka *	int bus_space_alloc __P((bus_space_tag_t t, bus_addr_t rstart,
1961.1Snonaka *	    bus_addr_t rend, bus_size_t size, bus_size_t align,
1971.2Snonaka *	    bus_size_t boundary, int flags, bus_addr_t *bpap,
1981.1Snonaka *	    bus_space_handle_t *bshp));
1991.1Snonaka *
2001.1Snonaka * Allocate a region of bus space.
2011.1Snonaka */
2021.1Snonaka
2031.2Snonakaint	prep_memio_alloc __P((bus_space_tag_t t, bus_addr_t rstart,
2041.2Snonaka	    bus_addr_t rend, bus_size_t size, bus_size_t align,
2051.2Snonaka	    bus_size_t boundary, int flags, bus_addr_t *bpap,
2061.2Snonaka	    bus_space_handle_t *bshp));
2071.2Snonaka
2081.2Snonaka#define bus_space_alloc(t, rs, re, s, a, b, f, ap, hp)			\
2091.2Snonaka    prep_memio_alloc((t), (rs), (re), (s), (a), (b), (f), (ap), (hp))
2101.1Snonaka
2111.1Snonaka/*
2121.1Snonaka *	int bus_space_free __P((bus_space_tag_t t,
2131.1Snonaka *	    bus_space_handle_t bsh, bus_size_t size));
2141.1Snonaka *
2151.1Snonaka * Free a region of bus space.
2161.1Snonaka */
2171.1Snonaka
2181.2Snonakavoid	prep_memio_free __P((bus_space_tag_t t, bus_space_handle_t bsh,
2191.2Snonaka	    bus_size_t size));
2201.2Snonaka
2211.2Snonaka#define	bus_space_free(t, h, s)						\
2221.2Snonaka    prep_memio_free((t), (h), (s))
2231.1Snonaka
2241.1Snonaka/*
2251.1Snonaka *	u_intN_t bus_space_read_N __P((bus_space_tag_t tag,
2261.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset));
2271.1Snonaka *
2281.1Snonaka * Read a 1, 2, 4, or 8 byte quantity from bus space
2291.1Snonaka * described by tag/handle/offset.
2301.1Snonaka */
2311.1Snonaka
2321.1Snonaka#define bus_space_read(n,m)						      \
2331.1Snonakastatic __inline CAT3(u_int,m,_t)					      \
2341.1SnonakaCAT(bus_space_read_,n)(bus_space_tag_t tag, bus_space_handle_t bsh,	      \
2351.1Snonaka     bus_size_t offset)							      \
2361.1Snonaka{									      \
2371.1Snonaka	return CAT3(in,m,rb)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)));  \
2381.1Snonaka}
2391.1Snonaka
2401.1Snonakabus_space_read(1,8)
2411.1Snonakabus_space_read(2,16)
2421.1Snonakabus_space_read(4,32)
2431.1Snonaka#define	bus_space_read_8	!!! bus_space_read_8 unimplemented !!!
2441.1Snonaka
2451.1Snonaka/*
2461.1Snonaka *	u_intN_t bus_space_read_stream_N __P((bus_space_tag_t tag,
2471.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset));
2481.1Snonaka *
2491.1Snonaka * Read a 2, 4, or 8 byte stream quantity from bus space
2501.1Snonaka * described by tag/handle/offset.
2511.1Snonaka */
2521.1Snonaka
2531.1Snonaka#define bus_space_read_stream(n,m)					      \
2541.1Snonakastatic __inline CAT3(u_int,m,_t)					      \
2551.1SnonakaCAT(bus_space_read_stream_,n)(bus_space_tag_t tag, bus_space_handle_t bsh,    \
2561.1Snonaka     bus_size_t offset)							      \
2571.1Snonaka{									      \
2581.1Snonaka	return CAT(in,m)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)));  \
2591.1Snonaka}
2601.1Snonaka
2611.1Snonakabus_space_read_stream(2,16)
2621.1Snonakabus_space_read_stream(4,32)
2631.1Snonaka#define	bus_space_read_stream_8	!!! bus_space_read_stream_8 unimplemented !!!
2641.1Snonaka
2651.1Snonaka/*
2661.1Snonaka *	void bus_space_read_multi_N __P((bus_space_tag_t tag,
2671.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset,
2681.1Snonaka *	    u_intN_t *addr, size_t count));
2691.1Snonaka *
2701.1Snonaka * Read `count' 1, 2, 4, or 8 byte quantities from bus space
2711.1Snonaka * described by tag/handle/offset and copy into buffer provided.
2721.1Snonaka */
2731.1Snonaka
2741.1Snonaka#define bus_space_read_multi(n,m)					      \
2751.1Snonakastatic __inline void							      \
2761.1SnonakaCAT(bus_space_read_multi_,n)(bus_space_tag_t tag, bus_space_handle_t bsh,     \
2771.1Snonaka     bus_size_t offset, CAT3(u_int,m,_t) *addr, size_t count)		      \
2781.1Snonaka{									      \
2791.1Snonaka	CAT3(ins,m,rb)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)),	      \
2801.1Snonaka	    (CAT3(u_int,m,_t) *)addr, (size_t)count);			      \
2811.1Snonaka}
2821.1Snonaka
2831.1Snonakabus_space_read_multi(1,8)
2841.1Snonakabus_space_read_multi(2,16)
2851.1Snonakabus_space_read_multi(4,32)
2861.1Snonaka#define	bus_space_read_multi_8	!!! bus_space_read_multi_8 not implemented !!!
2871.1Snonaka
2881.1Snonaka/*
2891.1Snonaka *	void bus_space_read_multi_stream_N __P((bus_space_tag_t tag,
2901.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset,
2911.1Snonaka *	    u_intN_t *addr, size_t count));
2921.1Snonaka *
2931.1Snonaka * Read `count' 2, 4, or 8 byte stream quantities from bus space
2941.1Snonaka * described by tag/handle/offset and copy into buffer provided.
2951.1Snonaka */
2961.1Snonaka
2971.1Snonaka#define bus_space_read_multi_stream(n,m)				      \
2981.1Snonakastatic __inline void							      \
2991.1SnonakaCAT(bus_space_read_multi_stream_,n)(bus_space_tag_t tag,		      \
3001.1Snonaka     bus_space_handle_t bsh,						      \
3011.1Snonaka     bus_size_t offset, CAT3(u_int,m,_t) *addr, size_t count)		      \
3021.1Snonaka{									      \
3031.1Snonaka	CAT(ins,m)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)),	      \
3041.1Snonaka	    (CAT3(u_int,m,_t) *)addr, (size_t)count);			      \
3051.1Snonaka}
3061.1Snonaka
3071.1Snonakabus_space_read_multi_stream(2,16)
3081.1Snonakabus_space_read_multi_stream(4,32)
3091.1Snonaka#define	bus_space_read_multi_stream_8					      \
3101.1Snonaka	!!! bus_space_read_multi_stream_8 not implemented !!!
3111.1Snonaka
3121.1Snonaka/*
3131.1Snonaka *	void bus_space_write_N __P((bus_space_tag_t tag,
3141.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset,
3151.1Snonaka *	    u_intN_t value));
3161.1Snonaka *
3171.1Snonaka * Write the 1, 2, 4, or 8 byte value `value' to bus space
3181.1Snonaka * described by tag/handle/offset.
3191.1Snonaka */
3201.1Snonaka
3211.1Snonaka#define bus_space_write(n,m)						      \
3221.1Snonakastatic __inline void							      \
3231.1SnonakaCAT(bus_space_write_,n)(bus_space_tag_t tag, bus_space_handle_t bsh,	      \
3241.1Snonaka     bus_size_t offset, CAT3(u_int,m,_t) x)				      \
3251.1Snonaka{									      \
3261.1Snonaka	CAT3(out,m,rb)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)), x);     \
3271.1Snonaka}
3281.1Snonaka
3291.1Snonakabus_space_write(1,8)
3301.1Snonakabus_space_write(2,16)
3311.1Snonakabus_space_write(4,32)
3321.1Snonaka#define	bus_space_write_8	!!! bus_space_write_8 unimplemented !!!
3331.1Snonaka
3341.1Snonaka/*
3351.1Snonaka *	void bus_space_write_stream_N __P((bus_space_tag_t tag,
3361.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset,
3371.1Snonaka *	    u_intN_t value));
3381.1Snonaka *
3391.1Snonaka * Write the 2, 4, or 8 byte stream value `value' to bus space
3401.1Snonaka * described by tag/handle/offset.
3411.1Snonaka */
3421.1Snonaka
3431.1Snonaka#define bus_space_write_stream(n,m)					      \
3441.1Snonakastatic __inline void							      \
3451.1SnonakaCAT(bus_space_write_stream_,n)(bus_space_tag_t tag, bus_space_handle_t bsh,   \
3461.1Snonaka     bus_size_t offset, CAT3(u_int,m,_t) x)				      \
3471.1Snonaka{									      \
3481.1Snonaka	CAT(out,m)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)), x);     \
3491.1Snonaka}
3501.1Snonaka
3511.1Snonakabus_space_write_stream(2,16)
3521.1Snonakabus_space_write_stream(4,32)
3531.1Snonaka#define	bus_space_write_stream_8 !!! bus_space_write_stream_8 unimplemented !!!
3541.1Snonaka
3551.1Snonaka/*
3561.1Snonaka *	void bus_space_write_multi_N __P((bus_space_tag_t tag,
3571.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset,
3581.1Snonaka *	    const u_intN_t *addr, size_t count));
3591.1Snonaka *
3601.1Snonaka * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
3611.1Snonaka * provided to bus space described by tag/handle/offset.
3621.1Snonaka */
3631.1Snonaka
3641.1Snonaka#define bus_space_write_multi(n,m)					      \
3651.1Snonakastatic __inline void							      \
3661.1SnonakaCAT(bus_space_write_multi_,n)(bus_space_tag_t tag, bus_space_handle_t bsh,    \
3671.1Snonaka     bus_size_t offset, const CAT3(u_int,m,_t) *addr, size_t count)	      \
3681.1Snonaka{									      \
3691.1Snonaka	CAT3(outs,m,rb)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)),	      \
3701.1Snonaka	    (CAT3(u_int,m,_t) *)addr, (size_t)count);			      \
3711.1Snonaka}
3721.1Snonaka
3731.1Snonakabus_space_write_multi(1,8)
3741.1Snonakabus_space_write_multi(2,16)
3751.1Snonakabus_space_write_multi(4,32)
3761.1Snonaka#define	bus_space_write_multi_8	!!! bus_space_write_multi_8 not implemented !!!
3771.1Snonaka
3781.1Snonaka/*
3791.1Snonaka *	void bus_space_write_multi_stream_N __P((bus_space_tag_t tag,
3801.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset,
3811.1Snonaka *	    const u_intN_t *addr, size_t count));
3821.1Snonaka *
3831.1Snonaka * Write `count' 2, 4, or 8 byte stream quantities from the buffer
3841.1Snonaka * provided to bus space described by tag/handle/offset.
3851.1Snonaka */
3861.1Snonaka
3871.1Snonaka#define bus_space_write_multi_stream(n,m)				      \
3881.1Snonakastatic __inline void							      \
3891.1SnonakaCAT(bus_space_write_multi_stream_,n)(bus_space_tag_t tag,		      \
3901.1Snonaka     bus_space_handle_t bsh,						      \
3911.1Snonaka     bus_size_t offset, const CAT3(u_int,m,_t) *addr, size_t count)	      \
3921.1Snonaka{									      \
3931.1Snonaka	CAT(outs,m)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)),	      \
3941.1Snonaka	    (CAT3(u_int,m,_t) *)addr, (size_t)count);			      \
3951.1Snonaka}
3961.1Snonaka
3971.1Snonakabus_space_write_multi_stream(2,16)
3981.1Snonakabus_space_write_multi_stream(4,32)
3991.1Snonaka#define	bus_space_write_multi_stream_8					      \
4001.1Snonaka	!!! bus_space_write_multi_stream_8 not implemented !!!
4011.1Snonaka
4021.1Snonaka/*
4031.1Snonaka *	void bus_space_read_region_N __P((bus_space_tag_t tag,
4041.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset,
4051.1Snonaka *	    u_intN_t *addr, size_t count));
4061.1Snonaka *
4071.1Snonaka * Read `count' 1, 2, 4, or 8 byte quantities from bus space
4081.1Snonaka * described by tag/handle and starting at `offset' and copy into
4091.1Snonaka * buffer provided.
4101.1Snonaka */
4111.1Snonakastatic __inline void bus_space_read_region_1 __P((bus_space_tag_t,
4121.1Snonaka	bus_space_handle_t, bus_size_t, u_int8_t *, size_t));
4131.1Snonakastatic __inline void bus_space_read_region_2 __P((bus_space_tag_t,
4141.1Snonaka	bus_space_handle_t, bus_size_t, u_int16_t *, size_t));
4151.1Snonakastatic __inline void bus_space_read_region_4 __P((bus_space_tag_t,
4161.1Snonaka	bus_space_handle_t, bus_size_t, u_int32_t *, size_t));
4171.1Snonaka
4181.1Snonakastatic __inline void
4191.1Snonakabus_space_read_region_1(tag, bsh, offset, addr, count)
4201.1Snonaka	bus_space_tag_t tag;
4211.1Snonaka	bus_space_handle_t bsh;
4221.1Snonaka	bus_size_t offset;
4231.1Snonaka	u_int8_t *addr;
4241.1Snonaka	size_t count;
4251.1Snonaka{
4261.1Snonaka	volatile u_int8_t *s;
4271.1Snonaka
4281.1Snonaka	s = (volatile u_int8_t *)(bsh + offset);
4291.1Snonaka	while (count--)
4301.1Snonaka		*addr++ = *s++;
4311.1Snonaka	__asm__ volatile("eieio; sync");
4321.1Snonaka}
4331.1Snonaka
4341.1Snonakastatic __inline void
4351.1Snonakabus_space_read_region_2(tag, bsh, offset, addr, count)
4361.1Snonaka	bus_space_tag_t tag;
4371.1Snonaka	bus_space_handle_t bsh;
4381.1Snonaka	bus_size_t offset;
4391.1Snonaka	u_int16_t *addr;
4401.1Snonaka	size_t count;
4411.1Snonaka{
4421.1Snonaka	volatile u_int16_t *s;
4431.1Snonaka
4441.1Snonaka	s = (volatile u_int16_t *)(bsh + offset);
4451.1Snonaka	while (count--)
4461.1Snonaka		__asm__ volatile("lhbrx %0, 0, %1" :
4471.1Snonaka			"=r"(*addr++) : "r"(s++));
4481.1Snonaka	__asm__ volatile("eieio; sync");
4491.1Snonaka}
4501.1Snonaka
4511.1Snonakastatic __inline void
4521.1Snonakabus_space_read_region_4(tag, bsh, offset, addr, count)
4531.1Snonaka	bus_space_tag_t tag;
4541.1Snonaka	bus_space_handle_t bsh;
4551.1Snonaka	bus_size_t offset;
4561.1Snonaka	u_int32_t *addr;
4571.1Snonaka	size_t count;
4581.1Snonaka{
4591.1Snonaka	volatile u_int32_t *s;
4601.1Snonaka
4611.1Snonaka	s = (volatile u_int32_t *)(bsh + offset);
4621.1Snonaka	while (count--)
4631.1Snonaka		__asm__ volatile("lwbrx %0, 0, %1" :
4641.1Snonaka			"=r"(*addr++) : "r"(s++));
4651.1Snonaka	__asm__ volatile("eieio; sync");
4661.1Snonaka}
4671.1Snonaka
4681.1Snonaka#define	bus_space_read_region_8	!!! bus_space_read_region_8 unimplemented !!!
4691.1Snonaka
4701.1Snonaka/*
4711.1Snonaka *	void bus_space_read_region_stream_N __P((bus_space_tag_t tag,
4721.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset,
4731.1Snonaka *	    u_intN_t *addr, size_t count));
4741.1Snonaka *
4751.1Snonaka * Read `count' 2, 4, or 8 byte stream quantities from bus space
4761.1Snonaka * described by tag/handle and starting at `offset' and copy into
4771.1Snonaka * buffer provided.
4781.1Snonaka */
4791.1Snonakastatic __inline void bus_space_read_region_stream_2 __P((bus_space_tag_t,
4801.1Snonaka	bus_space_handle_t, bus_size_t, u_int16_t *, size_t));
4811.1Snonakastatic __inline void bus_space_read_region_stream_4 __P((bus_space_tag_t,
4821.1Snonaka	bus_space_handle_t, bus_size_t, u_int32_t *, size_t));
4831.1Snonaka
4841.1Snonakastatic __inline void
4851.1Snonakabus_space_read_region_stream_2(tag, bsh, offset, addr, count)
4861.1Snonaka	bus_space_tag_t tag;
4871.1Snonaka	bus_space_handle_t bsh;
4881.1Snonaka	bus_size_t offset;
4891.1Snonaka	u_int16_t *addr;
4901.1Snonaka	size_t count;
4911.1Snonaka{
4921.1Snonaka	volatile u_int16_t *s;
4931.1Snonaka
4941.1Snonaka	s = (volatile u_int16_t *)(bsh + offset);
4951.1Snonaka	while (count--)
4961.1Snonaka		*addr++ = *s++;
4971.1Snonaka	__asm__ volatile("eieio; sync");
4981.1Snonaka}
4991.1Snonaka
5001.1Snonakastatic __inline void
5011.1Snonakabus_space_read_region_stream_4(tag, bsh, offset, addr, count)
5021.1Snonaka	bus_space_tag_t tag;
5031.1Snonaka	bus_space_handle_t bsh;
5041.1Snonaka	bus_size_t offset;
5051.1Snonaka	u_int32_t *addr;
5061.1Snonaka	size_t count;
5071.1Snonaka{
5081.1Snonaka	volatile u_int32_t *s;
5091.1Snonaka
5101.1Snonaka	s = (volatile u_int32_t *)(bsh + offset);
5111.1Snonaka	while (count--)
5121.1Snonaka		*addr++ = *s++;
5131.1Snonaka	__asm__ volatile("eieio; sync");
5141.1Snonaka}
5151.1Snonaka
5161.1Snonaka#define	bus_space_read_region_stream_8					      \
5171.1Snonaka	!!! bus_space_read_region_stream_8 unimplemented !!!
5181.1Snonaka
5191.1Snonaka/*
5201.1Snonaka *	void bus_space_write_region_N __P((bus_space_tag_t tag,
5211.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset,
5221.1Snonaka *	    const u_intN_t *addr, size_t count));
5231.1Snonaka *
5241.1Snonaka * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
5251.1Snonaka * to bus space described by tag/handle starting at `offset'.
5261.1Snonaka */
5271.1Snonakastatic __inline void bus_space_write_region_1 __P((bus_space_tag_t,
5281.1Snonaka	bus_space_handle_t, bus_size_t, const u_int8_t *, size_t));
5291.1Snonakastatic __inline void bus_space_write_region_2 __P((bus_space_tag_t,
5301.1Snonaka	bus_space_handle_t, bus_size_t, const u_int16_t *, size_t));
5311.1Snonakastatic __inline void bus_space_write_region_4 __P((bus_space_tag_t,
5321.1Snonaka	bus_space_handle_t, bus_size_t, const u_int32_t *, size_t));
5331.1Snonaka
5341.1Snonakastatic __inline void
5351.1Snonakabus_space_write_region_1(tag, bsh, offset, addr, count)
5361.1Snonaka	bus_space_tag_t tag;
5371.1Snonaka	bus_space_handle_t bsh;
5381.1Snonaka	bus_size_t offset;
5391.1Snonaka	const u_int8_t *addr;
5401.1Snonaka	size_t count;
5411.1Snonaka{
5421.1Snonaka	volatile u_int8_t *d;
5431.1Snonaka
5441.1Snonaka	d = (volatile u_int8_t *)(bsh + offset);
5451.1Snonaka	while (count--)
5461.1Snonaka		*d++ = *addr++;
5471.1Snonaka	__asm__ volatile("eieio; sync");
5481.1Snonaka}
5491.1Snonaka
5501.1Snonakastatic __inline void
5511.1Snonakabus_space_write_region_2(tag, bsh, offset, addr, count)
5521.1Snonaka	bus_space_tag_t tag;
5531.1Snonaka	bus_space_handle_t bsh;
5541.1Snonaka	bus_size_t offset;
5551.1Snonaka	const u_int16_t *addr;
5561.1Snonaka	size_t count;
5571.1Snonaka{
5581.1Snonaka	volatile u_int16_t *d;
5591.1Snonaka
5601.1Snonaka	d = (volatile u_int16_t *)(bsh + offset);
5611.1Snonaka	while (count--)
5621.1Snonaka		__asm__ volatile("sthbrx %0, 0, %1" ::
5631.1Snonaka			"r"(*addr++), "r"(d++));
5641.1Snonaka	__asm__ volatile("eieio; sync");
5651.1Snonaka}
5661.1Snonaka
5671.1Snonakastatic __inline void
5681.1Snonakabus_space_write_region_4(tag, bsh, offset, addr, count)
5691.1Snonaka	bus_space_tag_t tag;
5701.1Snonaka	bus_space_handle_t bsh;
5711.1Snonaka	bus_size_t offset;
5721.1Snonaka	const u_int32_t *addr;
5731.1Snonaka	size_t count;
5741.1Snonaka{
5751.1Snonaka	volatile u_int32_t *d;
5761.1Snonaka
5771.1Snonaka	d = (volatile u_int32_t *)(bsh + offset);
5781.1Snonaka	while (count--)
5791.1Snonaka		__asm__ volatile("stwbrx %0, 0, %1" ::
5801.1Snonaka			"r"(*addr++), "r"(d++));
5811.1Snonaka	__asm__ volatile("eieio; sync");
5821.1Snonaka}
5831.1Snonaka
5841.1Snonaka#define	bus_space_write_region_8 !!! bus_space_write_region_8 unimplemented !!!
5851.1Snonaka
5861.1Snonaka/*
5871.1Snonaka *	void bus_space_write_region_stream_N __P((bus_space_tag_t tag,
5881.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset,
5891.1Snonaka *	    const u_intN_t *addr, size_t count));
5901.1Snonaka *
5911.1Snonaka * Write `count' 2, 4, or 8 byte stream quantities from the buffer provided
5921.1Snonaka * to bus space described by tag/handle starting at `offset'.
5931.1Snonaka */
5941.1Snonakastatic __inline void bus_space_write_region_stream_2 __P((bus_space_tag_t,
5951.1Snonaka	bus_space_handle_t, bus_size_t, const u_int16_t *, size_t));
5961.1Snonakastatic __inline void bus_space_write_region_stream_4 __P((bus_space_tag_t,
5971.1Snonaka	bus_space_handle_t, bus_size_t, const u_int32_t *, size_t));
5981.1Snonaka
5991.1Snonakastatic __inline void
6001.1Snonakabus_space_write_region_stream_2(tag, bsh, offset, addr, count)
6011.1Snonaka	bus_space_tag_t tag;
6021.1Snonaka	bus_space_handle_t bsh;
6031.1Snonaka	bus_size_t offset;
6041.1Snonaka	const u_int16_t *addr;
6051.1Snonaka	size_t count;
6061.1Snonaka{
6071.1Snonaka	volatile u_int16_t *d;
6081.1Snonaka
6091.1Snonaka	d = (volatile u_int16_t *)(bsh + offset);
6101.1Snonaka	while (count--)
6111.1Snonaka		*d++ = *addr++;
6121.1Snonaka	__asm__ volatile("eieio; sync");
6131.1Snonaka}
6141.1Snonaka
6151.1Snonakastatic __inline void
6161.1Snonakabus_space_write_region_stream_4(tag, bsh, offset, addr, count)
6171.1Snonaka	bus_space_tag_t tag;
6181.1Snonaka	bus_space_handle_t bsh;
6191.1Snonaka	bus_size_t offset;
6201.1Snonaka	const u_int32_t *addr;
6211.1Snonaka	size_t count;
6221.1Snonaka{
6231.1Snonaka	volatile u_int32_t *d;
6241.1Snonaka
6251.1Snonaka	d = (volatile u_int32_t *)(bsh + offset);
6261.1Snonaka	while (count--)
6271.1Snonaka		*d++ = *addr++;
6281.1Snonaka	__asm__ volatile("eieio; sync");
6291.1Snonaka}
6301.1Snonaka
6311.1Snonaka#define	bus_space_write_region_stream_8					      \
6321.1Snonaka	 !!! bus_space_write_region_stream_8 unimplemented !!!
6331.1Snonaka
6341.1Snonaka/*
6351.1Snonaka *	void bus_space_set_multi_N __P((bus_space_tag_t tag,
6361.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
6371.1Snonaka *	    size_t count));
6381.1Snonaka *
6391.1Snonaka * Write the 1, 2, 4, or 8 byte value `val' to bus space described
6401.1Snonaka * by tag/handle/offset `count' times.
6411.1Snonaka */
6421.1Snonakastatic __inline void bus_space_set_multi_1 __P((bus_space_tag_t,
6431.1Snonaka	bus_space_handle_t, bus_size_t, u_int8_t, size_t));
6441.1Snonakastatic __inline void bus_space_set_multi_2 __P((bus_space_tag_t,
6451.1Snonaka	bus_space_handle_t, bus_size_t, u_int16_t, size_t));
6461.1Snonakastatic __inline void bus_space_set_multi_4 __P((bus_space_tag_t,
6471.1Snonaka	bus_space_handle_t, bus_size_t, u_int32_t, size_t));
6481.1Snonaka
6491.1Snonakastatic __inline void
6501.1Snonakabus_space_set_multi_1(tag, bsh, offset, val, count)
6511.1Snonaka	bus_space_tag_t tag;
6521.1Snonaka	bus_space_handle_t bsh;
6531.1Snonaka	bus_size_t offset;
6541.1Snonaka	u_int8_t val;
6551.1Snonaka	size_t count;
6561.1Snonaka{
6571.1Snonaka	volatile u_int8_t *d;
6581.1Snonaka
6591.1Snonaka	d = (volatile u_int8_t *)(bsh + offset);
6601.1Snonaka	while (count--)
6611.1Snonaka		*d = val;
6621.1Snonaka	__asm__ volatile("eieio; sync");
6631.1Snonaka}
6641.1Snonaka
6651.1Snonakastatic __inline void
6661.1Snonakabus_space_set_multi_2(tag, bsh, offset, val, count)
6671.1Snonaka	bus_space_tag_t tag;
6681.1Snonaka	bus_space_handle_t bsh;
6691.1Snonaka	bus_size_t offset;
6701.1Snonaka	u_int16_t val;
6711.1Snonaka	size_t count;
6721.1Snonaka{
6731.1Snonaka	volatile u_int16_t *d;
6741.1Snonaka
6751.1Snonaka	d = (volatile u_int16_t *)(bsh + offset);
6761.1Snonaka	while (count--)
6771.1Snonaka		__asm__ volatile("sthbrx %0, 0, %1" ::
6781.1Snonaka			"r"(val), "r"(d));
6791.1Snonaka	__asm__ volatile("eieio; sync");
6801.1Snonaka}
6811.1Snonaka
6821.1Snonakastatic __inline void
6831.1Snonakabus_space_set_multi_4(tag, bsh, offset, val, count)
6841.1Snonaka	bus_space_tag_t tag;
6851.1Snonaka	bus_space_handle_t bsh;
6861.1Snonaka	bus_size_t offset;
6871.1Snonaka	u_int32_t val;
6881.1Snonaka	size_t count;
6891.1Snonaka{
6901.1Snonaka	volatile u_int32_t *d;
6911.1Snonaka
6921.1Snonaka	d = (volatile u_int32_t *)(bsh + offset);
6931.1Snonaka	while (count--)
6941.1Snonaka		__asm__ volatile("stwbrx %0, 0, %1" ::
6951.1Snonaka			"r"(val), "r"(d));
6961.1Snonaka	__asm__ volatile("eieio; sync");
6971.1Snonaka}
6981.1Snonaka
6991.1Snonaka#define	bus_space_set_multi_8 !!! bus_space_set_multi_8 unimplemented !!!
7001.1Snonaka
7011.1Snonaka/*
7021.1Snonaka *	void bus_space_set_multi_stream_N __P((bus_space_tag_t tag,
7031.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
7041.1Snonaka *	    size_t count));
7051.1Snonaka *
7061.1Snonaka * Write the 2, 4, or 8 byte stream value `val' to bus space described
7071.1Snonaka * by tag/handle/offset `count' times.
7081.1Snonaka */
7091.1Snonakastatic __inline void bus_space_set_multi_stream_2 __P((bus_space_tag_t,
7101.1Snonaka	bus_space_handle_t, bus_size_t, u_int16_t, size_t));
7111.1Snonakastatic __inline void bus_space_set_multi_stream_4 __P((bus_space_tag_t,
7121.1Snonaka	bus_space_handle_t, bus_size_t, u_int32_t, size_t));
7131.1Snonaka
7141.1Snonakastatic __inline void
7151.1Snonakabus_space_set_multi_stream_2(tag, bsh, offset, val, count)
7161.1Snonaka	bus_space_tag_t tag;
7171.1Snonaka	bus_space_handle_t bsh;
7181.1Snonaka	bus_size_t offset;
7191.1Snonaka	u_int16_t val;
7201.1Snonaka	size_t count;
7211.1Snonaka{
7221.1Snonaka	volatile u_int16_t *d;
7231.1Snonaka
7241.1Snonaka	d = (volatile u_int16_t *)(bsh + offset);
7251.1Snonaka	while (count--)
7261.1Snonaka		*d = val;
7271.1Snonaka	__asm__ volatile("eieio; sync");
7281.1Snonaka}
7291.1Snonaka
7301.1Snonakastatic __inline void
7311.1Snonakabus_space_set_multi_stream_4(tag, bsh, offset, val, count)
7321.1Snonaka	bus_space_tag_t tag;
7331.1Snonaka	bus_space_handle_t bsh;
7341.1Snonaka	bus_size_t offset;
7351.1Snonaka	u_int32_t val;
7361.1Snonaka	size_t count;
7371.1Snonaka{
7381.1Snonaka	volatile u_int32_t *d;
7391.1Snonaka
7401.1Snonaka	d = (volatile u_int32_t *)(bsh + offset);
7411.1Snonaka	while (count--)
7421.1Snonaka		*d = val;
7431.1Snonaka	__asm__ volatile("eieio; sync");
7441.1Snonaka}
7451.1Snonaka
7461.1Snonaka#define	bus_space_set_multi_stream_8					      \
7471.1Snonaka	!!! bus_space_set_multi_stream_8 unimplemented !!!
7481.1Snonaka
7491.1Snonaka/*
7501.1Snonaka *	void bus_space_set_region_N __P((bus_space_tag_t tag,
7511.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
7521.1Snonaka *	    size_t count));
7531.1Snonaka *
7541.1Snonaka * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
7551.1Snonaka * by tag/handle starting at `offset'.
7561.1Snonaka */
7571.1Snonakastatic __inline void bus_space_set_region_1 __P((bus_space_tag_t,
7581.1Snonaka	bus_space_handle_t, bus_size_t, u_int8_t, size_t));
7591.1Snonakastatic __inline void bus_space_set_region_2 __P((bus_space_tag_t,
7601.1Snonaka	bus_space_handle_t, bus_size_t, u_int16_t, size_t));
7611.1Snonakastatic __inline void bus_space_set_region_4 __P((bus_space_tag_t,
7621.1Snonaka	bus_space_handle_t, bus_size_t, u_int32_t, size_t));
7631.1Snonaka
7641.1Snonakastatic __inline void
7651.1Snonakabus_space_set_region_1(tag, bsh, offset, val, count)
7661.1Snonaka	bus_space_tag_t tag;
7671.1Snonaka	bus_space_handle_t bsh;
7681.1Snonaka	bus_size_t offset;
7691.1Snonaka	u_int8_t val;
7701.1Snonaka	size_t count;
7711.1Snonaka{
7721.1Snonaka	volatile u_int8_t *d;
7731.1Snonaka
7741.1Snonaka	d = (volatile u_int8_t *)(bsh + offset);
7751.1Snonaka	while (count--)
7761.1Snonaka		*d++ = val;
7771.1Snonaka	__asm__ volatile("eieio; sync");
7781.1Snonaka}
7791.1Snonaka
7801.1Snonakastatic __inline void
7811.1Snonakabus_space_set_region_2(tag, bsh, offset, val, count)
7821.1Snonaka	bus_space_tag_t tag;
7831.1Snonaka	bus_space_handle_t bsh;
7841.1Snonaka	bus_size_t offset;
7851.1Snonaka	u_int16_t val;
7861.1Snonaka	size_t count;
7871.1Snonaka{
7881.1Snonaka	volatile u_int16_t *d;
7891.1Snonaka
7901.1Snonaka	d = (volatile u_int16_t *)(bsh + offset);
7911.1Snonaka	while (count--)
7921.1Snonaka		__asm__ volatile("sthbrx %0, 0, %1" ::
7931.1Snonaka			"r"(val), "r"(d++));
7941.1Snonaka	__asm__ volatile("eieio; sync");
7951.1Snonaka}
7961.1Snonaka
7971.1Snonakastatic __inline void
7981.1Snonakabus_space_set_region_4(tag, bsh, offset, val, count)
7991.1Snonaka	bus_space_tag_t tag;
8001.1Snonaka	bus_space_handle_t bsh;
8011.1Snonaka	bus_size_t offset;
8021.1Snonaka	u_int32_t val;
8031.1Snonaka	size_t count;
8041.1Snonaka{
8051.1Snonaka	volatile u_int32_t *d;
8061.1Snonaka
8071.1Snonaka	d = (volatile u_int32_t *)(bsh + offset);
8081.1Snonaka	while (count--)
8091.1Snonaka		__asm__ volatile("stwbrx %0, 0, %1" ::
8101.1Snonaka			"r"(val), "r"(d++));
8111.1Snonaka	__asm__ volatile("eieio; sync");
8121.1Snonaka}
8131.1Snonaka
8141.1Snonaka#define	bus_space_set_region_8 !!! bus_space_set_region_8 unimplemented !!!
8151.1Snonaka
8161.1Snonaka/*
8171.1Snonaka *	void bus_space_set_region_stream_N __P((bus_space_tag_t tag,
8181.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
8191.1Snonaka *	    size_t count));
8201.1Snonaka *
8211.1Snonaka * Write `count' 2, 4, or 8 byte stream value `val' to bus space described
8221.1Snonaka * by tag/handle starting at `offset'.
8231.1Snonaka */
8241.1Snonakastatic __inline void bus_space_set_region_stream_2 __P((bus_space_tag_t,
8251.1Snonaka	bus_space_handle_t, bus_size_t, u_int16_t, size_t));
8261.1Snonakastatic __inline void bus_space_set_region_stream_4 __P((bus_space_tag_t,
8271.1Snonaka	bus_space_handle_t, bus_size_t, u_int32_t, size_t));
8281.1Snonaka
8291.1Snonaka
8301.1Snonakastatic __inline void
8311.1Snonakabus_space_set_region_stream_2(tag, bsh, offset, val, count)
8321.1Snonaka	bus_space_tag_t tag;
8331.1Snonaka	bus_space_handle_t bsh;
8341.1Snonaka	bus_size_t offset;
8351.1Snonaka	u_int16_t val;
8361.1Snonaka	size_t count;
8371.1Snonaka{
8381.1Snonaka	volatile u_int16_t *d;
8391.1Snonaka
8401.1Snonaka	d = (volatile u_int16_t *)(bsh + offset);
8411.1Snonaka	while (count--)
8421.1Snonaka		*d++ = val;
8431.1Snonaka	__asm__ volatile("eieio; sync");
8441.1Snonaka}
8451.1Snonaka
8461.1Snonakastatic __inline void
8471.1Snonakabus_space_set_region_stream_4(tag, bsh, offset, val, count)
8481.1Snonaka	bus_space_tag_t tag;
8491.1Snonaka	bus_space_handle_t bsh;
8501.1Snonaka	bus_size_t offset;
8511.1Snonaka	u_int32_t val;
8521.1Snonaka	size_t count;
8531.1Snonaka{
8541.1Snonaka	volatile u_int32_t *d;
8551.1Snonaka
8561.1Snonaka	d = (volatile u_int32_t *)(bsh + offset);
8571.1Snonaka	while (count--)
8581.1Snonaka		*d++ = val;
8591.1Snonaka	__asm__ volatile("eieio; sync");
8601.1Snonaka}
8611.1Snonaka
8621.1Snonaka#define	bus_space_set_region_stream_8					      \
8631.1Snonaka	!!! bus_space_set_region_stream_8 unimplemented !!!
8641.1Snonaka
8651.1Snonaka/*
8661.1Snonaka *	void bus_space_copy_region_N __P((bus_space_tag_t tag,
8671.1Snonaka *	    bus_space_handle_t bsh1, bus_size_t off1,
8681.1Snonaka *	    bus_space_handle_t bsh2, bus_size_t off2,
8691.1Snonaka *	    size_t count));
8701.1Snonaka *
8711.1Snonaka * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
8721.1Snonaka * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
8731.1Snonaka */
8741.1Snonaka
8751.1Snonakastatic __inline void bus_space_copy_region_1 __P((bus_space_tag_t,
8761.1Snonaka	bus_space_handle_t, bus_size_t, bus_space_handle_t,
8771.1Snonaka	bus_size_t, size_t));
8781.1Snonakastatic __inline void bus_space_copy_region_2 __P((bus_space_tag_t,
8791.1Snonaka	bus_space_handle_t, bus_size_t, bus_space_handle_t,
8801.1Snonaka	bus_size_t, size_t));
8811.1Snonakastatic __inline void bus_space_copy_region_4 __P((bus_space_tag_t,
8821.1Snonaka	bus_space_handle_t, bus_size_t, bus_space_handle_t,
8831.1Snonaka	bus_size_t, size_t));
8841.1Snonaka
8851.1Snonakastatic __inline void
8861.1Snonakabus_space_copy_region_1(t, h1, o1, h2, o2, c)
8871.1Snonaka	bus_space_tag_t t;
8881.1Snonaka	bus_space_handle_t h1;
8891.1Snonaka	bus_size_t o1;
8901.1Snonaka	bus_space_handle_t h2;
8911.1Snonaka	bus_size_t o2;
8921.1Snonaka	size_t c;
8931.1Snonaka{
8941.1Snonaka	bus_addr_t addr1 = h1 + o1;
8951.1Snonaka	bus_addr_t addr2 = h2 + o2;
8961.1Snonaka
8971.1Snonaka	if (addr1 >= addr2) {
8981.1Snonaka		/* src after dest: copy forward */
8991.1Snonaka		for (; c != 0; c--, addr1++, addr2++)
9001.1Snonaka			*(volatile u_int8_t *)(addr2) =
9011.1Snonaka			    *(volatile u_int8_t *)(addr1);
9021.1Snonaka	} else {
9031.1Snonaka		/* dest after src: copy backwards */
9041.1Snonaka		for (addr1 += (c - 1), addr2 += (c - 1);
9051.1Snonaka		    c != 0; c--, addr1--, addr2--)
9061.1Snonaka			*(volatile u_int8_t *)(addr2) =
9071.1Snonaka			    *(volatile u_int8_t *)(addr1);
9081.1Snonaka	}
9091.1Snonaka}
9101.1Snonaka
9111.1Snonakastatic __inline void
9121.1Snonakabus_space_copy_region_2(t, h1, o1, h2, o2, c)
9131.1Snonaka	bus_space_tag_t t;
9141.1Snonaka	bus_space_handle_t h1;
9151.1Snonaka	bus_size_t o1;
9161.1Snonaka	bus_space_handle_t h2;
9171.1Snonaka	bus_size_t o2;
9181.1Snonaka	size_t c;
9191.1Snonaka{
9201.1Snonaka	bus_addr_t addr1 = h1 + o1;
9211.1Snonaka	bus_addr_t addr2 = h2 + o2;
9221.1Snonaka
9231.1Snonaka	if (addr1 >= addr2) {
9241.1Snonaka		/* src after dest: copy forward */
9251.1Snonaka		for (; c != 0; c--, addr1 += 2, addr2 += 2)
9261.1Snonaka			*(volatile u_int16_t *)(addr2) =
9271.1Snonaka			    *(volatile u_int16_t *)(addr1);
9281.1Snonaka	} else {
9291.1Snonaka		/* dest after src: copy backwards */
9301.1Snonaka		for (addr1 += 2 * (c - 1), addr2 += 2 * (c - 1);
9311.1Snonaka		    c != 0; c--, addr1 -= 2, addr2 -= 2)
9321.1Snonaka			*(volatile u_int16_t *)(addr2) =
9331.1Snonaka			    *(volatile u_int16_t *)(addr1);
9341.1Snonaka	}
9351.1Snonaka}
9361.1Snonaka
9371.1Snonakastatic __inline void
9381.1Snonakabus_space_copy_region_4(t, h1, o1, h2, o2, c)
9391.1Snonaka	bus_space_tag_t t;
9401.1Snonaka	bus_space_handle_t h1;
9411.1Snonaka	bus_size_t o1;
9421.1Snonaka	bus_space_handle_t h2;
9431.1Snonaka	bus_size_t o2;
9441.1Snonaka	size_t c;
9451.1Snonaka{
9461.1Snonaka	bus_addr_t addr1 = h1 + o1;
9471.1Snonaka	bus_addr_t addr2 = h2 + o2;
9481.1Snonaka
9491.1Snonaka	if (addr1 >= addr2) {
9501.1Snonaka		/* src after dest: copy forward */
9511.1Snonaka		for (; c != 0; c--, addr1 += 4, addr2 += 4)
9521.1Snonaka			*(volatile u_int32_t *)(addr2) =
9531.1Snonaka			    *(volatile u_int32_t *)(addr1);
9541.1Snonaka	} else {
9551.1Snonaka		/* dest after src: copy backwards */
9561.1Snonaka		for (addr1 += 4 * (c - 1), addr2 += 4 * (c - 1);
9571.1Snonaka		    c != 0; c--, addr1 -= 4, addr2 -= 4)
9581.1Snonaka			*(volatile u_int32_t *)(addr2) =
9591.1Snonaka			    *(volatile u_int32_t *)(addr1);
9601.1Snonaka	}
9611.1Snonaka}
9621.1Snonaka
9631.1Snonaka#define	bus_space_copy_region_8	!!! bus_space_copy_region_8 unimplemented !!!
9641.1Snonaka
9651.1Snonaka/*
9661.1Snonaka * Bus read/write barrier methods.
9671.1Snonaka *
9681.1Snonaka *	void bus_space_barrier __P((bus_space_tag_t tag,
9691.1Snonaka *	    bus_space_handle_t bsh, bus_size_t offset,
9701.1Snonaka *	    bus_size_t len, int flags));
9711.1Snonaka *
9721.1Snonaka */
9731.1Snonaka#define	bus_space_barrier(t, h, o, l, f)	\
9741.1Snonaka	((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
9751.1Snonaka#define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
9761.1Snonaka#define	BUS_SPACE_BARRIER_WRITE	0x02		/* force write barrier */
9771.1Snonaka
9781.1Snonaka#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
9791.1Snonaka
9801.1Snonaka/*
9811.1Snonaka * Bus DMA methods.
9821.1Snonaka */
9831.1Snonaka
9841.1Snonaka/*
9851.1Snonaka * Flags used in various bus DMA methods.
9861.1Snonaka */
9871.1Snonaka#define	BUS_DMA_WAITOK		0x00	/* safe to sleep (pseudo-flag) */
9881.1Snonaka#define	BUS_DMA_NOWAIT		0x01	/* not safe to sleep */
9891.1Snonaka#define	BUS_DMA_ALLOCNOW	0x02	/* perform resource allocation now */
9901.1Snonaka#define	BUS_DMA_COHERENT	0x04	/* hint: map memory DMA coherent */
9911.1Snonaka#define	BUS_DMA_BUS1		0x10	/* placeholders for bus functions... */
9921.1Snonaka#define	BUS_DMA_BUS2		0x20
9931.1Snonaka#define	BUS_DMA_BUS3		0x40
9941.1Snonaka#define	BUS_DMA_BUS4		0x80
9951.1Snonaka
9961.1Snonaka/* Forwards needed by prototypes below. */
9971.1Snonakastruct mbuf;
9981.1Snonakastruct uio;
9991.1Snonaka
10001.1Snonaka/*
10011.1Snonaka * Operations performed by bus_dmamap_sync().
10021.1Snonaka */
10031.1Snonaka#define	BUS_DMASYNC_PREREAD	0x01	/* pre-read synchronization */
10041.1Snonaka#define	BUS_DMASYNC_POSTREAD	0x02	/* post-read synchronization */
10051.1Snonaka#define	BUS_DMASYNC_PREWRITE	0x04	/* pre-write synchronization */
10061.1Snonaka#define	BUS_DMASYNC_POSTWRITE	0x08	/* post-write synchronization */
10071.1Snonaka
10081.1Snonakatypedef struct prep_bus_dma_tag		*bus_dma_tag_t;
10091.1Snonakatypedef struct prep_bus_dmamap		*bus_dmamap_t;
10101.1Snonaka
10111.1Snonaka/*
10121.1Snonaka *	bus_dma_segment_t
10131.1Snonaka *
10141.1Snonaka *	Describes a single contiguous DMA transaction.  Values
10151.1Snonaka *	are suitable for programming into DMA registers.
10161.1Snonaka */
10171.1Snonakastruct prep_bus_dma_segment {
10181.1Snonaka	bus_addr_t	ds_addr;	/* DMA address */
10191.1Snonaka	bus_size_t	ds_len;		/* length of transfer */
10201.1Snonaka};
10211.1Snonakatypedef struct prep_bus_dma_segment	bus_dma_segment_t;
10221.1Snonaka
10231.1Snonaka/*
10241.1Snonaka *	bus_dma_tag_t
10251.1Snonaka *
10261.1Snonaka *	A machine-dependent opaque type describing the implementation of
10271.1Snonaka *	DMA for a given bus.
10281.1Snonaka */
10291.1Snonaka
10301.1Snonakastruct prep_bus_dma_tag {
10311.1Snonaka	/*
10321.1Snonaka	 * The `bounce threshold' is checked while we are loading
10331.1Snonaka	 * the DMA map.  If the physical address of the segment
10341.1Snonaka	 * exceeds the threshold, an error will be returned.  The
10351.1Snonaka	 * caller can then take whatever action is necessary to
10361.1Snonaka	 * bounce the transfer.  If this value is 0, it will be
10371.1Snonaka	 * ignored.
10381.1Snonaka	 */
10391.1Snonaka	bus_addr_t _bounce_thresh;
10401.1Snonaka
10411.1Snonaka	/*
10421.1Snonaka	 * DMA mapping methods.
10431.1Snonaka	 */
10441.1Snonaka	int	(*_dmamap_create) __P((bus_dma_tag_t, bus_size_t, int,
10451.1Snonaka		    bus_size_t, bus_size_t, int, bus_dmamap_t *));
10461.1Snonaka	void	(*_dmamap_destroy) __P((bus_dma_tag_t, bus_dmamap_t));
10471.1Snonaka	int	(*_dmamap_load) __P((bus_dma_tag_t, bus_dmamap_t, void *,
10481.1Snonaka		    bus_size_t, struct proc *, int));
10491.1Snonaka	int	(*_dmamap_load_mbuf) __P((bus_dma_tag_t, bus_dmamap_t,
10501.1Snonaka		    struct mbuf *, int));
10511.1Snonaka	int	(*_dmamap_load_uio) __P((bus_dma_tag_t, bus_dmamap_t,
10521.1Snonaka		    struct uio *, int));
10531.1Snonaka	int	(*_dmamap_load_raw) __P((bus_dma_tag_t, bus_dmamap_t,
10541.1Snonaka		    bus_dma_segment_t *, int, bus_size_t, int));
10551.1Snonaka	void	(*_dmamap_unload) __P((bus_dma_tag_t, bus_dmamap_t));
10561.1Snonaka	void	(*_dmamap_sync) __P((bus_dma_tag_t, bus_dmamap_t,
10571.1Snonaka		    bus_addr_t, bus_size_t, int));
10581.1Snonaka
10591.1Snonaka	/*
10601.1Snonaka	 * DMA memory utility functions.
10611.1Snonaka	 */
10621.1Snonaka	int	(*_dmamem_alloc) __P((bus_dma_tag_t, bus_size_t, bus_size_t,
10631.1Snonaka		    bus_size_t, bus_dma_segment_t *, int, int *, int));
10641.1Snonaka	void	(*_dmamem_free) __P((bus_dma_tag_t,
10651.1Snonaka		    bus_dma_segment_t *, int));
10661.1Snonaka	int	(*_dmamem_map) __P((bus_dma_tag_t, bus_dma_segment_t *,
10671.1Snonaka		    int, size_t, caddr_t *, int));
10681.1Snonaka	void	(*_dmamem_unmap) __P((bus_dma_tag_t, caddr_t, size_t));
10691.3Ssimonb	paddr_t	(*_dmamem_mmap) __P((bus_dma_tag_t, bus_dma_segment_t *,
10701.3Ssimonb		    int, off_t, int, int));
10711.1Snonaka};
10721.1Snonaka
10731.1Snonaka#define	bus_dmamap_create(t, s, n, m, b, f, p)			\
10741.1Snonaka	(*(t)->_dmamap_create)((t), (s), (n), (m), (b), (f), (p))
10751.1Snonaka#define	bus_dmamap_destroy(t, p)				\
10761.1Snonaka	(*(t)->_dmamap_destroy)((t), (p))
10771.1Snonaka#define	bus_dmamap_load(t, m, b, s, p, f)			\
10781.1Snonaka	(*(t)->_dmamap_load)((t), (m), (b), (s), (p), (f))
10791.1Snonaka#define	bus_dmamap_load_mbuf(t, m, b, f)			\
10801.1Snonaka	(*(t)->_dmamap_load_mbuf)((t), (m), (b), (f))
10811.1Snonaka#define	bus_dmamap_load_uio(t, m, u, f)				\
10821.1Snonaka	(*(t)->_dmamap_load_uio)((t), (m), (u), (f))
10831.1Snonaka#define	bus_dmamap_load_raw(t, m, sg, n, s, f)			\
10841.1Snonaka	(*(t)->_dmamap_load_raw)((t), (m), (sg), (n), (s), (f))
10851.1Snonaka#define	bus_dmamap_unload(t, p)					\
10861.1Snonaka	(*(t)->_dmamap_unload)((t), (p))
10871.1Snonaka#define	bus_dmamap_sync(t, p, o, l, ops)			\
10881.1Snonaka	(void)((t)->_dmamap_sync ?				\
10891.1Snonaka	    (*(t)->_dmamap_sync)((t), (p), (o), (l), (ops)) : (void)0)
10901.1Snonaka
10911.1Snonaka#define	bus_dmamem_alloc(t, s, a, b, sg, n, r, f)		\
10921.1Snonaka	(*(t)->_dmamem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f))
10931.1Snonaka#define	bus_dmamem_free(t, sg, n)				\
10941.1Snonaka	(*(t)->_dmamem_free)((t), (sg), (n))
10951.1Snonaka#define	bus_dmamem_map(t, sg, n, s, k, f)			\
10961.1Snonaka	(*(t)->_dmamem_map)((t), (sg), (n), (s), (k), (f))
10971.1Snonaka#define	bus_dmamem_unmap(t, k, s)				\
10981.1Snonaka	(*(t)->_dmamem_unmap)((t), (k), (s))
10991.1Snonaka#define	bus_dmamem_mmap(t, sg, n, o, p, f)			\
11001.1Snonaka	(*(t)->_dmamem_mmap)((t), (sg), (n), (o), (p), (f))
11011.1Snonaka
11021.1Snonaka/*
11031.1Snonaka *	bus_dmamap_t
11041.1Snonaka *
11051.1Snonaka *	Describes a DMA mapping.
11061.1Snonaka */
11071.1Snonakastruct prep_bus_dmamap {
11081.1Snonaka	/*
11091.1Snonaka	 * PRIVATE MEMBERS: not for use my machine-independent code.
11101.1Snonaka	 */
11111.1Snonaka	bus_size_t	_dm_size;	/* largest DMA transfer mappable */
11121.1Snonaka	int		_dm_segcnt;	/* number of segs this map can map */
11131.1Snonaka	bus_size_t	_dm_maxsegsz;	/* largest possible segment */
11141.1Snonaka	bus_size_t	_dm_boundary;	/* don't cross this */
11151.1Snonaka	bus_addr_t	_dm_bounce_thresh; /* bounce threshold; see tag */
11161.1Snonaka	int		_dm_flags;	/* misc. flags */
11171.1Snonaka
11181.1Snonaka	void		*_dm_cookie;	/* cookie for bus-specific functions */
11191.1Snonaka
11201.1Snonaka	/*
11211.1Snonaka	 * PUBLIC MEMBERS: these are used by machine-independent code.
11221.1Snonaka	 */
11231.1Snonaka	bus_size_t	dm_mapsize;	/* size of the mapping */
11241.1Snonaka	int		dm_nsegs;	/* # valid segments in mapping */
11251.1Snonaka	bus_dma_segment_t dm_segs[1];	/* segments; variable length */
11261.1Snonaka};
11271.1Snonaka
11281.1Snonaka#ifdef _PREP_BUS_DMA_PRIVATE
11291.1Snonakaint	_bus_dmamap_create __P((bus_dma_tag_t, bus_size_t, int, bus_size_t,
11301.1Snonaka	    bus_size_t, int, bus_dmamap_t *));
11311.1Snonakavoid	_bus_dmamap_destroy __P((bus_dma_tag_t, bus_dmamap_t));
11321.1Snonakaint	_bus_dmamap_load __P((bus_dma_tag_t, bus_dmamap_t, void *,
11331.1Snonaka	    bus_size_t, struct proc *, int));
11341.1Snonakaint	_bus_dmamap_load_mbuf __P((bus_dma_tag_t, bus_dmamap_t,
11351.1Snonaka	    struct mbuf *, int));
11361.1Snonakaint	_bus_dmamap_load_uio __P((bus_dma_tag_t, bus_dmamap_t,
11371.1Snonaka	    struct uio *, int));
11381.1Snonakaint	_bus_dmamap_load_raw __P((bus_dma_tag_t, bus_dmamap_t,
11391.1Snonaka	    bus_dma_segment_t *, int, bus_size_t, int));
11401.1Snonakavoid	_bus_dmamap_unload __P((bus_dma_tag_t, bus_dmamap_t));
11411.1Snonakavoid	_bus_dmamap_sync __P((bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
11421.1Snonaka	    bus_size_t, int));
11431.1Snonaka
11441.1Snonakaint	_bus_dmamem_alloc __P((bus_dma_tag_t tag, bus_size_t size,
11451.1Snonaka	    bus_size_t alignment, bus_size_t boundary,
11461.1Snonaka	    bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags));
11471.1Snonakavoid	_bus_dmamem_free __P((bus_dma_tag_t tag, bus_dma_segment_t *segs,
11481.1Snonaka	    int nsegs));
11491.1Snonakaint	_bus_dmamem_map __P((bus_dma_tag_t tag, bus_dma_segment_t *segs,
11501.1Snonaka	    int nsegs, size_t size, caddr_t *kvap, int flags));
11511.1Snonakavoid	_bus_dmamem_unmap __P((bus_dma_tag_t tag, caddr_t kva,
11521.1Snonaka	    size_t size));
11531.3Ssimonbpaddr_t	_bus_dmamem_mmap __P((bus_dma_tag_t tag, bus_dma_segment_t *segs,
11541.3Ssimonb	    int nsegs, off_t off, int prot, int flags));
11551.1Snonaka
11561.1Snonakaint	_bus_dmamem_alloc_range __P((bus_dma_tag_t tag, bus_size_t size,
11571.1Snonaka	    bus_size_t alignment, bus_size_t boundary,
11581.1Snonaka	    bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags,
11591.1Snonaka	    paddr_t low, paddr_t high));
11601.1Snonaka#endif /* _PREP_BUS_DMA_PRIVATE */
11611.1Snonaka#endif /* _PREP_BUS_H_ */
1162