zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

bus.h (29505B) - Raw


      1 /*	$NetBSD: bus.h,v 1.11 2003/07/28 17:35:54 thorpej Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
      9  * NASA Ames Research Center.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions and the following disclaimer.
     16  * 2. Redistributions in binary form must reproduce the above copyright
     17  *    notice, this list of conditions and the following disclaimer in the
     18  *    documentation and/or other materials provided with the distribution.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30  * POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 /*-
     34  * SPDX-License-Identifier: BSD-4-Clause
     35  *
     36  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
     37  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
     38  *
     39  * Redistribution and use in source and binary forms, with or without
     40  * modification, are permitted provided that the following conditions
     41  * are met:
     42  * 1. Redistributions of source code must retain the above copyright
     43  *    notice, this list of conditions and the following disclaimer.
     44  * 2. Redistributions in binary form must reproduce the above copyright
     45  *    notice, this list of conditions and the following disclaimer in the
     46  *    documentation and/or other materials provided with the distribution.
     47  * 3. All advertising materials mentioning features or use of this software
     48  *    must display the following acknowledgement:
     49  *      This product includes software developed by Christopher G. Demetriou
     50  *	for the NetBSD Project.
     51  * 4. The name of the author may not be used to endorse or promote products
     52  *    derived from this software without specific prior written permission
     53  *
     54  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     55  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     56  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     57  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     58  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     59  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     60  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     61  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     62  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     63  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     64  */
     65 
     66 #ifndef _MACHINE_BUS_H_
     67 #define _MACHINE_BUS_H_
     68 
     69 #include <machine/_bus.h>
     70 
     71 /*
     72  *	int bus_space_map  (bus_space_tag_t t, bus_addr_t addr,
     73  *	    bus_size_t size, int flags, bus_space_handle_t *bshp);
     74  *
     75  * Map a region of bus space.
     76  */
     77 
     78 #define	BUS_SPACE_MAP_CACHEABLE		0x01
     79 #define	BUS_SPACE_MAP_LINEAR		0x02
     80 #define	BUS_SPACE_MAP_PREFETCHABLE     	0x04
     81 
     82 /*
     83  * Bus space for ARM.
     84  *
     85  * The functions used most often are grouped together at the beginning to ensure
     86  * that all the data fits into a single cache line.  The inline implementations
     87  * of single read/write access these values a lot.
     88  */
     89 struct bus_space {
     90 	/* Read/write single and barrier: the most commonly used functions. */
     91 	uint8_t	 (*bs_r_1)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
     92 	uint32_t (*bs_r_4)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
     93 	void	 (*bs_w_1)(bus_space_tag_t, bus_space_handle_t,
     94 			   bus_size_t, uint8_t);
     95 	void	 (*bs_w_4)(bus_space_tag_t, bus_space_handle_t,
     96 			   bus_size_t, uint32_t);
     97 	void	 (*bs_barrier)(bus_space_tag_t, bus_space_handle_t,
     98 			       bus_size_t, bus_size_t, int);
     99 
    100 	/* Backlink to parent (if copied), and implementation private data. */
    101 	struct bus_space *bs_parent;
    102 	void		 *bs_privdata;
    103 
    104 	/* mapping/unmapping */
    105 	int		(*bs_map) (bus_space_tag_t, bus_addr_t, bus_size_t,
    106 			    int, bus_space_handle_t *);
    107 	void		(*bs_unmap) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
    108 	int		(*bs_subregion) (bus_space_tag_t, bus_space_handle_t,
    109 			    bus_size_t, bus_size_t, bus_space_handle_t *);
    110 
    111 	/* allocation/deallocation */
    112 	int		(*bs_alloc) (bus_space_tag_t, bus_addr_t, bus_addr_t,
    113 			    bus_size_t, bus_size_t, bus_size_t, int,
    114 			    bus_addr_t *, bus_space_handle_t *);
    115 	void		(*bs_free) (bus_space_tag_t, bus_space_handle_t,
    116 			    bus_size_t);
    117 
    118 	/* Read single, the less commonly used functions. */
    119 	uint16_t	(*bs_r_2) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
    120 	uint64_t	(*bs_r_8) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
    121 
    122 	/* read multiple */
    123 	void		(*bs_rm_1) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
    124 	    uint8_t *, bus_size_t);
    125 	void		(*bs_rm_2) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
    126 	    uint16_t *, bus_size_t);
    127 	void		(*bs_rm_4) (bus_space_tag_t, bus_space_handle_t,
    128 			    bus_size_t, uint32_t *, bus_size_t);
    129 	void		(*bs_rm_8) (bus_space_tag_t, bus_space_handle_t,
    130 			    bus_size_t, uint64_t *, bus_size_t);
    131 
    132 	/* read region */
    133 	void		(*bs_rr_1) (bus_space_tag_t, bus_space_handle_t,
    134 			    bus_size_t, uint8_t *, bus_size_t);
    135 	void		(*bs_rr_2) (bus_space_tag_t, bus_space_handle_t,
    136 			    bus_size_t, uint16_t *, bus_size_t);
    137 	void		(*bs_rr_4) (bus_space_tag_t, bus_space_handle_t,
    138 			    bus_size_t, uint32_t *, bus_size_t);
    139 	void		(*bs_rr_8) (bus_space_tag_t, bus_space_handle_t,
    140 			    bus_size_t, uint64_t *, bus_size_t);
    141 
    142 	/* Write single, the less commonly used functions. */
    143 	void		(*bs_w_2) (bus_space_tag_t, bus_space_handle_t,
    144 			    bus_size_t, uint16_t);
    145 	void		(*bs_w_8) (bus_space_tag_t, bus_space_handle_t,
    146 			    bus_size_t, uint64_t);
    147 
    148 	/* write multiple */
    149 	void		(*bs_wm_1) (bus_space_tag_t, bus_space_handle_t,
    150 			    bus_size_t, const uint8_t *, bus_size_t);
    151 	void		(*bs_wm_2) (bus_space_tag_t, bus_space_handle_t,
    152 			    bus_size_t, const uint16_t *, bus_size_t);
    153 	void		(*bs_wm_4) (bus_space_tag_t, bus_space_handle_t,
    154 			    bus_size_t, const uint32_t *, bus_size_t);
    155 	void		(*bs_wm_8) (bus_space_tag_t, bus_space_handle_t,
    156 			    bus_size_t, const uint64_t *, bus_size_t);
    157 
    158 	/* write region */
    159 	void		(*bs_wr_1) (bus_space_tag_t, bus_space_handle_t,
    160 			    bus_size_t, const uint8_t *, bus_size_t);
    161 	void		(*bs_wr_2) (bus_space_tag_t, bus_space_handle_t,
    162 			    bus_size_t, const uint16_t *, bus_size_t);
    163 	void		(*bs_wr_4) (bus_space_tag_t, bus_space_handle_t,
    164 			    bus_size_t, const uint32_t *, bus_size_t);
    165 	void		(*bs_wr_8) (bus_space_tag_t, bus_space_handle_t,
    166 			    bus_size_t, const uint64_t *, bus_size_t);
    167 
    168 	/* set multiple */
    169 	void		(*bs_sm_1) (bus_space_tag_t, bus_space_handle_t,
    170 			    bus_size_t, uint8_t, bus_size_t);
    171 	void		(*bs_sm_2) (bus_space_tag_t, bus_space_handle_t,
    172 			    bus_size_t, uint16_t, bus_size_t);
    173 	void		(*bs_sm_4) (bus_space_tag_t, bus_space_handle_t,
    174 			    bus_size_t, uint32_t, bus_size_t);
    175 	void		(*bs_sm_8) (bus_space_tag_t, bus_space_handle_t,
    176 			    bus_size_t, uint64_t, bus_size_t);
    177 
    178 	/* set region */
    179 	void		(*bs_sr_1) (bus_space_tag_t, bus_space_handle_t,
    180 			    bus_size_t, uint8_t, bus_size_t);
    181 	void		(*bs_sr_2) (bus_space_tag_t, bus_space_handle_t,
    182 			    bus_size_t, uint16_t, bus_size_t);
    183 	void		(*bs_sr_4) (bus_space_tag_t, bus_space_handle_t,
    184 			    bus_size_t, uint32_t, bus_size_t);
    185 	void		(*bs_sr_8) (bus_space_tag_t, bus_space_handle_t,
    186 			    bus_size_t, uint64_t, bus_size_t);
    187 
    188 	/* copy */
    189 	void		(*bs_c_1) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
    190 			    bus_space_handle_t, bus_size_t, bus_size_t);
    191 	void		(*bs_c_2) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
    192 			    bus_space_handle_t, bus_size_t, bus_size_t);
    193 	void		(*bs_c_4) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
    194 			    bus_space_handle_t, bus_size_t, bus_size_t);
    195 	void		(*bs_c_8) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
    196 			    bus_space_handle_t, bus_size_t, bus_size_t);
    197 
    198 	/* read stream (single) */
    199 	uint8_t	(*bs_r_1_s) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
    200 	uint16_t	(*bs_r_2_s) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
    201 	uint32_t	(*bs_r_4_s) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
    202 	uint64_t	(*bs_r_8_s) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
    203 
    204 	/* read multiple stream */
    205 	void		(*bs_rm_1_s) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
    206 	    uint8_t *, bus_size_t);
    207 	void		(*bs_rm_2_s) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
    208 	    uint16_t *, bus_size_t);
    209 	void		(*bs_rm_4_s) (bus_space_tag_t, bus_space_handle_t,
    210 			    bus_size_t, uint32_t *, bus_size_t);
    211 	void		(*bs_rm_8_s) (bus_space_tag_t, bus_space_handle_t,
    212 			    bus_size_t, uint64_t *, bus_size_t);
    213 
    214 	/* read region stream */
    215 	void		(*bs_rr_1_s) (bus_space_tag_t, bus_space_handle_t,
    216 			    bus_size_t, uint8_t *, bus_size_t);
    217 	void		(*bs_rr_2_s) (bus_space_tag_t, bus_space_handle_t,
    218 			    bus_size_t, uint16_t *, bus_size_t);
    219 	void		(*bs_rr_4_s) (bus_space_tag_t, bus_space_handle_t,
    220 			    bus_size_t, uint32_t *, bus_size_t);
    221 	void		(*bs_rr_8_s) (bus_space_tag_t, bus_space_handle_t,
    222 			    bus_size_t, uint64_t *, bus_size_t);
    223 
    224 	/* write stream (single) */
    225 	void		(*bs_w_1_s) (bus_space_tag_t, bus_space_handle_t,
    226 			    bus_size_t, uint8_t);
    227 	void		(*bs_w_2_s) (bus_space_tag_t, bus_space_handle_t,
    228 			    bus_size_t, uint16_t);
    229 	void		(*bs_w_4_s) (bus_space_tag_t, bus_space_handle_t,
    230 			    bus_size_t, uint32_t);
    231 	void		(*bs_w_8_s) (bus_space_tag_t, bus_space_handle_t,
    232 			    bus_size_t, uint64_t);
    233 
    234 	/* write multiple stream */
    235 	void		(*bs_wm_1_s) (bus_space_tag_t, bus_space_handle_t,
    236 			    bus_size_t, const uint8_t *, bus_size_t);
    237 	void		(*bs_wm_2_s) (bus_space_tag_t, bus_space_handle_t,
    238 			    bus_size_t, const uint16_t *, bus_size_t);
    239 	void		(*bs_wm_4_s) (bus_space_tag_t, bus_space_handle_t,
    240 			    bus_size_t, const uint32_t *, bus_size_t);
    241 	void		(*bs_wm_8_s) (bus_space_tag_t, bus_space_handle_t,
    242 			    bus_size_t, const uint64_t *, bus_size_t);
    243 
    244 	/* write region stream */
    245 	void		(*bs_wr_1_s) (bus_space_tag_t, bus_space_handle_t,
    246 			    bus_size_t, const uint8_t *, bus_size_t);
    247 	void		(*bs_wr_2_s) (bus_space_tag_t, bus_space_handle_t,
    248 			    bus_size_t, const uint16_t *, bus_size_t);
    249 	void		(*bs_wr_4_s) (bus_space_tag_t, bus_space_handle_t,
    250 			    bus_size_t, const uint32_t *, bus_size_t);
    251 	void		(*bs_wr_8_s) (bus_space_tag_t, bus_space_handle_t,
    252 			    bus_size_t, const uint64_t *, bus_size_t);
    253 };
    254 
    255 /*
    256  * Utility macros; INTERNAL USE ONLY.
    257  */
    258 #define	__bs_c(a,b)		__CONCAT(a,b)
    259 #define	__bs_opname(op,size)	__bs_c(__bs_c(__bs_c(bs_,op),_),size)
    260 
    261 #define	__bs_nonsingle(type, sz, t, h, o, a, c)				\
    262 	(*(t)->__bs_opname(type,sz))((t), h, o, a, c)
    263 #define	__bs_set(type, sz, t, h, o, v, c)				\
    264 	(*(t)->__bs_opname(type,sz))((t), h, o, v, c)
    265 #define	__bs_copy(sz, t, h1, o1, h2, o2, cnt)				\
    266 	(*(t)->__bs_opname(c,sz))((t), h1, o1, h2, o2, cnt)
    267 
    268 #define	__bs_opname_s(op,size)	__bs_c(__bs_c(__bs_c(__bs_c(bs_,op),_),size),_s)
    269 #define	__bs_rs_s(sz, t, h, o)						\
    270 	(*(t)->__bs_opname_s(r,sz))((t), h, o)
    271 #define	__bs_ws_s(sz, t, h, o, v)					\
    272 	(*(t)->__bs_opname_s(w,sz))((t), h, o, v)
    273 #define	__bs_nonsingle_s(type, sz, t, h, o, a, c)			\
    274 	(*(t)->__bs_opname_s(type,sz))((t), h, o, a, c)
    275 
    276 #define __generate_inline_bs_rs(IFN, MBR, TYP)					\
    277 	static inline TYP						\
    278 	IFN(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)	\
    279 	{								\
    280 									\
    281 		if (__predict_true(t->MBR == NULL))			\
    282 			return (*(volatile TYP *)(h + o));		\
    283 		else							\
    284 			return (t->MBR(t, h, o));		\
    285 	}
    286 
    287 #define __generate_inline_bs_ws(IFN, MBR, TYP)					\
    288 	static inline void						\
    289 	IFN(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, TYP v)\
    290 	{								\
    291 									\
    292 		if (__predict_true(t->MBR == NULL))			\
    293 			*(volatile TYP *)(h + o) = v;			\
    294 		else							\
    295 			t->MBR(t, h, o, v);			\
    296 	}
    297 
    298 /*
    299  * Mapping and unmapping operations.
    300  */
    301 #define	bus_space_map(t, a, s, c, hp)					\
    302 	(*(t)->bs_map)((t), (a), (s), (c), (hp))
    303 #define	bus_space_unmap(t, h, s)					\
    304 	(*(t)->bs_unmap)((t), (h), (s))
    305 #define	bus_space_subregion(t, h, o, s, hp)				\
    306 	(*(t)->bs_subregion)((t), (h), (o), (s), (hp))
    307 
    308 /*
    309  * Allocation and deallocation operations.
    310  */
    311 #define	bus_space_alloc(t, rs, re, s, a, b, c, ap, hp)			\
    312 	(*(t)->bs_alloc)((t), (rs), (re), (s), (a), (b),	\
    313 	    (c), (ap), (hp))
    314 #define	bus_space_free(t, h, s)						\
    315 	(*(t)->bs_free)((t), (h), (s))
    316 
    317 /*
    318  * Bus barrier operations.
    319  */
    320 #define	bus_space_barrier(t, h, o, l, f)				\
    321 	(*(t)->bs_barrier)((t), (h), (o), (l), (f))
    322 
    323 #define	BUS_SPACE_BARRIER_READ	0x01
    324 #define	BUS_SPACE_BARRIER_WRITE	0x02
    325 
    326 /*
    327  * Bus read (single) operations.
    328  */
    329 __generate_inline_bs_rs(bus_space_read_1, bs_r_1, uint8_t);
    330 __generate_inline_bs_rs(bus_space_read_2, bs_r_2, uint16_t);
    331 __generate_inline_bs_rs(bus_space_read_4, bs_r_4, uint32_t);
    332 __generate_inline_bs_rs(bus_space_read_8, bs_r_8, uint64_t);
    333 
    334 __generate_inline_bs_rs(bus_space_read_stream_1, bs_r_1_s, uint8_t);
    335 __generate_inline_bs_rs(bus_space_read_stream_2, bs_r_2_s, uint16_t);
    336 __generate_inline_bs_rs(bus_space_read_stream_4, bs_r_4_s, uint32_t);
    337 __generate_inline_bs_rs(bus_space_read_stream_8, bs_r_8_s, uint64_t);
    338 
    339 /*
    340  * Bus read multiple operations.
    341  */
    342 #define	bus_space_read_multi_1(t, h, o, a, c)				\
    343 	__bs_nonsingle(rm,1,(t),(h),(o),(a),(c))
    344 #define	bus_space_read_multi_2(t, h, o, a, c)				\
    345 	__bs_nonsingle(rm,2,(t),(h),(o),(a),(c))
    346 #define	bus_space_read_multi_4(t, h, o, a, c)				\
    347 	__bs_nonsingle(rm,4,(t),(h),(o),(a),(c))
    348 #define	bus_space_read_multi_8(t, h, o, a, c)				\
    349 	__bs_nonsingle(rm,8,(t),(h),(o),(a),(c))
    350 
    351 #define	bus_space_read_multi_stream_1(t, h, o, a, c)			\
    352 	__bs_nonsingle_s(rm,1,(t),(h),(o),(a),(c))
    353 #define	bus_space_read_multi_stream_2(t, h, o, a, c)			\
    354 	__bs_nonsingle_s(rm,2,(t),(h),(o),(a),(c))
    355 #define	bus_space_read_multi_stream_4(t, h, o, a, c)			\
    356 	__bs_nonsingle_s(rm,4,(t),(h),(o),(a),(c))
    357 #define	bus_space_read_multi_stream_8(t, h, o, a, c)			\
    358 	__bs_nonsingle_s(rm,8,(t),(h),(o),(a),(c))
    359 
    360 /*
    361  * Bus read region operations.
    362  */
    363 #define	bus_space_read_region_1(t, h, o, a, c)				\
    364 	__bs_nonsingle(rr,1,(t),(h),(o),(a),(c))
    365 #define	bus_space_read_region_2(t, h, o, a, c)				\
    366 	__bs_nonsingle(rr,2,(t),(h),(o),(a),(c))
    367 #define	bus_space_read_region_4(t, h, o, a, c)				\
    368 	__bs_nonsingle(rr,4,(t),(h),(o),(a),(c))
    369 #define	bus_space_read_region_8(t, h, o, a, c)				\
    370 	__bs_nonsingle(rr,8,(t),(h),(o),(a),(c))
    371 
    372 #define	bus_space_read_region_stream_1(t, h, o, a, c)			\
    373 	__bs_nonsingle_s(rr,1,(t),(h),(o),(a),(c))
    374 #define	bus_space_read_region_stream_2(t, h, o, a, c)			\
    375 	__bs_nonsingle_s(rr,2,(t),(h),(o),(a),(c))
    376 #define	bus_space_read_region_stream_4(t, h, o, a, c)			\
    377 	__bs_nonsingle_s(rr,4,(t),(h),(o),(a),(c))
    378 #define	bus_space_read_region_stream_8(t, h, o, a, c)			\
    379 	__bs_nonsingle_s(rr,8,(t),(h),(o),(a),(c))
    380 
    381 /*
    382  * Bus write (single) operations.
    383  */
    384 __generate_inline_bs_ws(bus_space_write_1, bs_w_1, uint8_t);
    385 __generate_inline_bs_ws(bus_space_write_2, bs_w_2, uint16_t);
    386 __generate_inline_bs_ws(bus_space_write_4, bs_w_4, uint32_t);
    387 __generate_inline_bs_ws(bus_space_write_8, bs_w_8, uint64_t);
    388 
    389 __generate_inline_bs_ws(bus_space_write_stream_1, bs_w_1_s, uint8_t);
    390 __generate_inline_bs_ws(bus_space_write_stream_2, bs_w_2_s, uint16_t);
    391 __generate_inline_bs_ws(bus_space_write_stream_4, bs_w_4_s, uint32_t);
    392 __generate_inline_bs_ws(bus_space_write_stream_8, bs_w_8_s, uint64_t);
    393 
    394 /*
    395  * Bus write multiple operations.
    396  */
    397 #define	bus_space_write_multi_1(t, h, o, a, c)				\
    398 	__bs_nonsingle(wm,1,(t),(h),(o),(a),(c))
    399 #define	bus_space_write_multi_2(t, h, o, a, c)				\
    400 	__bs_nonsingle(wm,2,(t),(h),(o),(a),(c))
    401 #define	bus_space_write_multi_4(t, h, o, a, c)				\
    402 	__bs_nonsingle(wm,4,(t),(h),(o),(a),(c))
    403 #define	bus_space_write_multi_8(t, h, o, a, c)				\
    404 	__bs_nonsingle(wm,8,(t),(h),(o),(a),(c))
    405 
    406 #define	bus_space_write_multi_stream_1(t, h, o, a, c)			\
    407 	__bs_nonsingle_s(wm,1,(t),(h),(o),(a),(c))
    408 #define	bus_space_write_multi_stream_2(t, h, o, a, c)			\
    409 	__bs_nonsingle_s(wm,2,(t),(h),(o),(a),(c))
    410 #define	bus_space_write_multi_stream_4(t, h, o, a, c)			\
    411 	__bs_nonsingle_s(wm,4,(t),(h),(o),(a),(c))
    412 #define	bus_space_write_multi_stream_8(t, h, o, a, c)			\
    413 	__bs_nonsingle_s(wm,8,(t),(h),(o),(a),(c))
    414 
    415 /*
    416  * Bus write region operations.
    417  */
    418 #define	bus_space_write_region_1(t, h, o, a, c)				\
    419 	__bs_nonsingle(wr,1,(t),(h),(o),(a),(c))
    420 #define	bus_space_write_region_2(t, h, o, a, c)				\
    421 	__bs_nonsingle(wr,2,(t),(h),(o),(a),(c))
    422 #define	bus_space_write_region_4(t, h, o, a, c)				\
    423 	__bs_nonsingle(wr,4,(t),(h),(o),(a),(c))
    424 #define	bus_space_write_region_8(t, h, o, a, c)				\
    425 	__bs_nonsingle(wr,8,(t),(h),(o),(a),(c))
    426 
    427 #define	bus_space_write_region_stream_1(t, h, o, a, c)			\
    428 	__bs_nonsingle_s(wr,1,(t),(h),(o),(a),(c))
    429 #define	bus_space_write_region_stream_2(t, h, o, a, c)			\
    430 	__bs_nonsingle_s(wr,2,(t),(h),(o),(a),(c))
    431 #define	bus_space_write_region_stream_4(t, h, o, a, c)			\
    432 	__bs_nonsingle_s(wr,4,(t),(h),(o),(a),(c))
    433 #define	bus_space_write_region_stream_8(t, h, o, a, c)			\
    434 	__bs_nonsingle_s(wr,8,(t),(h),(o),(a),(c))
    435 
    436 /*
    437  * Set multiple operations.
    438  */
    439 #define	bus_space_set_multi_1(t, h, o, v, c)				\
    440 	__bs_set(sm,1,(t),(h),(o),(v),(c))
    441 #define	bus_space_set_multi_2(t, h, o, v, c)				\
    442 	__bs_set(sm,2,(t),(h),(o),(v),(c))
    443 #define	bus_space_set_multi_4(t, h, o, v, c)				\
    444 	__bs_set(sm,4,(t),(h),(o),(v),(c))
    445 #define	bus_space_set_multi_8(t, h, o, v, c)				\
    446 	__bs_set(sm,8,(t),(h),(o),(v),(c))
    447 
    448 /*
    449  * Set region operations.
    450  */
    451 #define	bus_space_set_region_1(t, h, o, v, c)				\
    452 	__bs_set(sr,1,(t),(h),(o),(v),(c))
    453 #define	bus_space_set_region_2(t, h, o, v, c)				\
    454 	__bs_set(sr,2,(t),(h),(o),(v),(c))
    455 #define	bus_space_set_region_4(t, h, o, v, c)				\
    456 	__bs_set(sr,4,(t),(h),(o),(v),(c))
    457 #define	bus_space_set_region_8(t, h, o, v, c)				\
    458 	__bs_set(sr,8,(t),(h),(o),(v),(c))
    459 
    460 /*
    461  * Copy operations.
    462  */
    463 #define	bus_space_copy_region_1(t, h1, o1, h2, o2, c)				\
    464 	__bs_copy(1, t, h1, o1, h2, o2, c)
    465 #define	bus_space_copy_region_2(t, h1, o1, h2, o2, c)				\
    466 	__bs_copy(2, t, h1, o1, h2, o2, c)
    467 #define	bus_space_copy_region_4(t, h1, o1, h2, o2, c)				\
    468 	__bs_copy(4, t, h1, o1, h2, o2, c)
    469 #define	bus_space_copy_region_8(t, h1, o1, h2, o2, c)				\
    470 	__bs_copy(8, t, h1, o1, h2, o2, c)
    471 
    472 /*
    473  * Macros to provide prototypes for all the functions used in the
    474  * bus_space structure
    475  */
    476 
    477 #define bs_map_proto(f)							\
    478 int	__bs_c(f,_bs_map) (bus_space_tag_t t, bus_addr_t addr,		\
    479 	    bus_size_t size, int cacheable, bus_space_handle_t *bshp);
    480 
    481 #define bs_unmap_proto(f)						\
    482 void	__bs_c(f,_bs_unmap) (bus_space_tag_t t, bus_space_handle_t bsh,		\
    483 	    bus_size_t size);
    484 
    485 #define bs_subregion_proto(f)						\
    486 int	__bs_c(f,_bs_subregion) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    487 	    bus_size_t offset, bus_size_t size, 			\
    488 	    bus_space_handle_t *nbshp);
    489 
    490 #define bs_alloc_proto(f)						\
    491 int	__bs_c(f,_bs_alloc) (bus_space_tag_t t, bus_addr_t rstart,		\
    492 	    bus_addr_t rend, bus_size_t size, bus_size_t align,		\
    493 	    bus_size_t boundary, int cacheable, bus_addr_t *addrp,	\
    494 	    bus_space_handle_t *bshp);
    495 
    496 #define bs_free_proto(f)						\
    497 void	__bs_c(f,_bs_free) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    498 	    bus_size_t size);
    499 
    500 #define bs_mmap_proto(f)						\
    501 int	__bs_c(f,_bs_mmap) (struct cdev *, vm_offset_t, vm_paddr_t *, int);
    502 
    503 #define bs_barrier_proto(f)						\
    504 void	__bs_c(f,_bs_barrier) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    505 	    bus_size_t offset, bus_size_t len, int flags);
    506 
    507 #define	bs_r_1_proto(f)							\
    508 uint8_t	__bs_c(f,_bs_r_1) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    509 		    bus_size_t offset);
    510 
    511 #define	bs_r_2_proto(f)							\
    512 uint16_t	__bs_c(f,_bs_r_2) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    513 		    bus_size_t offset);
    514 
    515 #define	bs_r_4_proto(f)							\
    516 uint32_t	__bs_c(f,_bs_r_4) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    517 		    bus_size_t offset);
    518 
    519 #define	bs_r_8_proto(f)							\
    520 uint64_t	__bs_c(f,_bs_r_8) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    521 		    bus_size_t offset);
    522 
    523 #define	bs_r_1_s_proto(f)						\
    524 uint8_t	__bs_c(f,_bs_r_1_s) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    525 		    bus_size_t offset);
    526 
    527 #define	bs_r_2_s_proto(f)						\
    528 uint16_t	__bs_c(f,_bs_r_2_s) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    529 		    bus_size_t offset);
    530 
    531 #define	bs_r_4_s_proto(f)						\
    532 uint32_t	__bs_c(f,_bs_r_4_s) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    533 		    bus_size_t offset);
    534 
    535 #define	bs_w_1_proto(f)							\
    536 void	__bs_c(f,_bs_w_1) (bus_space_tag_t t, bus_space_handle_t bsh,		\
    537 	    bus_size_t offset, uint8_t value);
    538 
    539 #define	bs_w_2_proto(f)							\
    540 void	__bs_c(f,_bs_w_2) (bus_space_tag_t t, bus_space_handle_t bsh,		\
    541 	    bus_size_t offset, uint16_t value);
    542 
    543 #define	bs_w_4_proto(f)							\
    544 void	__bs_c(f,_bs_w_4) (bus_space_tag_t t, bus_space_handle_t bsh,		\
    545 	    bus_size_t offset, uint32_t value);
    546 
    547 #define	bs_w_8_proto(f)							\
    548 void	__bs_c(f,_bs_w_8) (bus_space_tag_t t, bus_space_handle_t bsh,		\
    549 	    bus_size_t offset, uint64_t value);
    550 
    551 #define	bs_w_1_s_proto(f)						\
    552 void	__bs_c(f,_bs_w_1_s) (bus_space_tag_t t, bus_space_handle_t bsh,		\
    553 	    bus_size_t offset, uint8_t value);
    554 
    555 #define	bs_w_2_s_proto(f)						\
    556 void	__bs_c(f,_bs_w_2_s) (bus_space_tag_t t, bus_space_handle_t bsh,		\
    557 	    bus_size_t offset, uint16_t value);
    558 
    559 #define	bs_w_4_s_proto(f)						\
    560 void	__bs_c(f,_bs_w_4_s) (bus_space_tag_t t, bus_space_handle_t bsh,		\
    561 	    bus_size_t offset, uint32_t value);
    562 
    563 #define	bs_rm_1_proto(f)						\
    564 void	__bs_c(f,_bs_rm_1) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    565 	    bus_size_t offset, uint8_t *addr, bus_size_t count);
    566 
    567 #define	bs_rm_2_proto(f)						\
    568 void	__bs_c(f,_bs_rm_2) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    569 	    bus_size_t offset, uint16_t *addr, bus_size_t count);
    570 
    571 #define	bs_rm_4_proto(f)						\
    572 void	__bs_c(f,_bs_rm_4) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    573 	    bus_size_t offset, uint32_t *addr, bus_size_t count);
    574 
    575 #define	bs_rm_8_proto(f)						\
    576 void	__bs_c(f,_bs_rm_8) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    577 	    bus_size_t offset, uint64_t *addr, bus_size_t count);
    578 
    579 #define	bs_wm_1_proto(f)						\
    580 void	__bs_c(f,_bs_wm_1) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    581 	    bus_size_t offset, const uint8_t *addr, bus_size_t count);
    582 
    583 #define	bs_wm_2_proto(f)						\
    584 void	__bs_c(f,_bs_wm_2) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    585 	    bus_size_t offset, const uint16_t *addr, bus_size_t count);
    586 
    587 #define	bs_wm_4_proto(f)						\
    588 void	__bs_c(f,_bs_wm_4) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    589 	    bus_size_t offset, const uint32_t *addr, bus_size_t count);
    590 
    591 #define	bs_wm_8_proto(f)						\
    592 void	__bs_c(f,_bs_wm_8) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    593 	    bus_size_t offset, const uint64_t *addr, bus_size_t count);
    594 
    595 #define	bs_rr_1_proto(f)						\
    596 void	__bs_c(f, _bs_rr_1) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    597 	    bus_size_t offset, uint8_t *addr, bus_size_t count);
    598 
    599 #define	bs_rr_2_proto(f)						\
    600 void	__bs_c(f, _bs_rr_2) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    601 	    bus_size_t offset, uint16_t *addr, bus_size_t count);
    602 
    603 #define	bs_rr_4_proto(f)						\
    604 void	__bs_c(f, _bs_rr_4) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    605 	    bus_size_t offset, uint32_t *addr, bus_size_t count);
    606 
    607 #define	bs_rr_8_proto(f)						\
    608 void	__bs_c(f, _bs_rr_8) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    609 	    bus_size_t offset, uint64_t *addr, bus_size_t count);
    610 
    611 #define	bs_wr_1_proto(f)						\
    612 void	__bs_c(f, _bs_wr_1) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    613 	    bus_size_t offset, const uint8_t *addr, bus_size_t count);
    614 
    615 #define	bs_wr_2_proto(f)						\
    616 void	__bs_c(f, _bs_wr_2) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    617 	    bus_size_t offset, const uint16_t *addr, bus_size_t count);
    618 
    619 #define	bs_wr_4_proto(f)						\
    620 void	__bs_c(f, _bs_wr_4) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    621 	    bus_size_t offset, const uint32_t *addr, bus_size_t count);
    622 
    623 #define	bs_wr_8_proto(f)						\
    624 void	__bs_c(f, _bs_wr_8) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    625 	    bus_size_t offset, const uint64_t *addr, bus_size_t count);
    626 
    627 #define	bs_sm_1_proto(f)						\
    628 void	__bs_c(f,_bs_sm_1) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    629 	    bus_size_t offset, uint8_t value, bus_size_t count);
    630 
    631 #define	bs_sm_2_proto(f)						\
    632 void	__bs_c(f,_bs_sm_2) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    633 	    bus_size_t offset, uint16_t value, bus_size_t count);
    634 
    635 #define	bs_sm_4_proto(f)						\
    636 void	__bs_c(f,_bs_sm_4) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    637 	    bus_size_t offset, uint32_t value, bus_size_t count);
    638 
    639 #define	bs_sm_8_proto(f)						\
    640 void	__bs_c(f,_bs_sm_8) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    641 	    bus_size_t offset, uint64_t value, bus_size_t count);
    642 
    643 #define	bs_sr_1_proto(f)						\
    644 void	__bs_c(f,_bs_sr_1) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    645 	    bus_size_t offset, uint8_t value, bus_size_t count);
    646 
    647 #define	bs_sr_2_proto(f)						\
    648 void	__bs_c(f,_bs_sr_2) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    649 	    bus_size_t offset, uint16_t value, bus_size_t count);
    650 
    651 #define	bs_sr_4_proto(f)						\
    652 void	__bs_c(f,_bs_sr_4) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    653 	    bus_size_t offset, uint32_t value, bus_size_t count);
    654 
    655 #define	bs_sr_8_proto(f)						\
    656 void	__bs_c(f,_bs_sr_8) (bus_space_tag_t t, bus_space_handle_t bsh,	\
    657 	    bus_size_t offset, uint64_t value, bus_size_t count);
    658 
    659 #define	bs_c_1_proto(f)							\
    660 void	__bs_c(f,_bs_c_1) (bus_space_tag_t t, bus_space_handle_t bsh1,	\
    661 	    bus_size_t offset1, bus_space_handle_t bsh2,		\
    662 	    bus_size_t offset2, bus_size_t count);
    663 
    664 #define	bs_c_2_proto(f)							\
    665 void	__bs_c(f,_bs_c_2) (bus_space_tag_t t, bus_space_handle_t bsh1,	\
    666 	    bus_size_t offset1, bus_space_handle_t bsh2,		\
    667 	    bus_size_t offset2, bus_size_t count);
    668 
    669 #define	bs_c_4_proto(f)							\
    670 void	__bs_c(f,_bs_c_4) (bus_space_tag_t t, bus_space_handle_t bsh1,	\
    671 	    bus_size_t offset1, bus_space_handle_t bsh2,		\
    672 	    bus_size_t offset2, bus_size_t count);
    673 
    674 #define	bs_c_8_proto(f)							\
    675 void	__bs_c(f,_bs_c_8) (bus_space_tag_t t, bus_space_handle_t bsh1,	\
    676 	    bus_size_t offset1, bus_space_handle_t bsh2,		\
    677 	    bus_size_t offset2, bus_size_t count);
    678 
    679 #define bs_protos(f)		\
    680 bs_map_proto(f);		\
    681 bs_unmap_proto(f);		\
    682 bs_subregion_proto(f);		\
    683 bs_alloc_proto(f);		\
    684 bs_free_proto(f);		\
    685 bs_mmap_proto(f);		\
    686 bs_barrier_proto(f);		\
    687 bs_r_1_proto(f);		\
    688 bs_r_2_proto(f);		\
    689 bs_r_4_proto(f);		\
    690 bs_r_8_proto(f);		\
    691 bs_r_1_s_proto(f);		\
    692 bs_r_2_s_proto(f);		\
    693 bs_r_4_s_proto(f);		\
    694 bs_w_1_proto(f);		\
    695 bs_w_2_proto(f);		\
    696 bs_w_4_proto(f);		\
    697 bs_w_8_proto(f);		\
    698 bs_w_1_s_proto(f);		\
    699 bs_w_2_s_proto(f);		\
    700 bs_w_4_s_proto(f);		\
    701 bs_rm_1_proto(f);		\
    702 bs_rm_2_proto(f);		\
    703 bs_rm_4_proto(f);		\
    704 bs_rm_8_proto(f);		\
    705 bs_wm_1_proto(f);		\
    706 bs_wm_2_proto(f);		\
    707 bs_wm_4_proto(f);		\
    708 bs_wm_8_proto(f);		\
    709 bs_rr_1_proto(f);		\
    710 bs_rr_2_proto(f);		\
    711 bs_rr_4_proto(f);		\
    712 bs_rr_8_proto(f);		\
    713 bs_wr_1_proto(f);		\
    714 bs_wr_2_proto(f);		\
    715 bs_wr_4_proto(f);		\
    716 bs_wr_8_proto(f);		\
    717 bs_sm_1_proto(f);		\
    718 bs_sm_2_proto(f);		\
    719 bs_sm_4_proto(f);		\
    720 bs_sm_8_proto(f);		\
    721 bs_sr_1_proto(f);		\
    722 bs_sr_2_proto(f);		\
    723 bs_sr_4_proto(f);		\
    724 bs_sr_8_proto(f);		\
    725 bs_c_1_proto(f);		\
    726 bs_c_2_proto(f);		\
    727 bs_c_4_proto(f);		\
    728 bs_c_8_proto(f);
    729 
    730 void generic_bs_unimplemented(void);
    731 #define	BS_UNIMPLEMENTED	(void *)generic_bs_unimplemented
    732 
    733 #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
    734 
    735 #define BUS_SPACE_MAXADDR_24BIT	0xFFFFFF
    736 #define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
    737 #define BUS_SPACE_MAXADDR 	0xFFFFFFFF
    738 #define BUS_SPACE_MAXSIZE_24BIT	0xFFFFFF
    739 #define BUS_SPACE_MAXSIZE_32BIT	0xFFFFFFFF
    740 #define BUS_SPACE_MAXSIZE 	0xFFFFFFFF
    741 
    742 #define BUS_SPACE_UNRESTRICTED	(~0)
    743 
    744 #define BUS_PEEK_FUNC(width, type)					\
    745 	static inline int						\
    746 	bus_space_peek_##width(bus_space_tag_t tag,			\
    747 	    bus_space_handle_t hnd, bus_size_t offset, type *value)	\
    748 	{								\
    749 		type tmp;						\
    750 		tmp = bus_space_read_##width(tag, hnd, offset);		\
    751 		*value = (type)tmp;					\
    752 		return (0);						\
    753 	}
    754 BUS_PEEK_FUNC(1, uint8_t)
    755 BUS_PEEK_FUNC(2, uint16_t)
    756 BUS_PEEK_FUNC(4, uint32_t)
    757 BUS_PEEK_FUNC(8, uint64_t)
    758 
    759 #define BUS_POKE_FUNC(width, type)					\
    760 	static inline int						\
    761 	bus_space_poke_##width(bus_space_tag_t tag,			\
    762 	    bus_space_handle_t hnd, bus_size_t offset, type value)	\
    763 	{								\
    764 		bus_space_write_##width(tag, hnd, offset, value);	\
    765 		return (0); 						\
    766 	}
    767 BUS_POKE_FUNC(1, uint8_t)
    768 BUS_POKE_FUNC(2, uint16_t)
    769 BUS_POKE_FUNC(4, uint32_t)
    770 BUS_POKE_FUNC(8, uint64_t)
    771 
    772 #include <machine/bus_dma.h>
    773 
    774 /*
    775  * Get the physical address of a bus space memory-mapped resource.
    776  * Doing this as a macro is a temporary solution until a more robust fix is
    777  * designed.  It also serves to mark the locations needing that fix.
    778  */
    779 #define BUS_SPACE_PHYSADDR(res, offs) \
    780 	((u_int)(rman_get_start(res)+(offs)))
    781 
    782 #endif /* _MACHINE_BUS_H_ */