xref: /netbsd-src/sys/arch/arm/include/bus_defs.h (revision 5158b98c3ad5629f6fdc5db5d57b396373690489)
1*5158b98cSjmcneill /*	$NetBSD: bus_defs.h,v 1.19 2022/10/15 11:07:38 jmcneill Exp $	*/
259adf08eSdyoung 
359adf08eSdyoung /*-
459adf08eSdyoung  * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
559adf08eSdyoung  * All rights reserved.
659adf08eSdyoung  *
759adf08eSdyoung  * This code is derived from software contributed to The NetBSD Foundation
859adf08eSdyoung  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
959adf08eSdyoung  * NASA Ames Research Center.
1059adf08eSdyoung  *
1159adf08eSdyoung  * Redistribution and use in source and binary forms, with or without
1259adf08eSdyoung  * modification, are permitted provided that the following conditions
1359adf08eSdyoung  * are met:
1459adf08eSdyoung  * 1. Redistributions of source code must retain the above copyright
1559adf08eSdyoung  *    notice, this list of conditions and the following disclaimer.
1659adf08eSdyoung  * 2. Redistributions in binary form must reproduce the above copyright
1759adf08eSdyoung  *    notice, this list of conditions and the following disclaimer in the
1859adf08eSdyoung  *    documentation and/or other materials provided with the distribution.
1959adf08eSdyoung  *
2059adf08eSdyoung  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2159adf08eSdyoung  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2259adf08eSdyoung  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2359adf08eSdyoung  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2459adf08eSdyoung  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2559adf08eSdyoung  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2659adf08eSdyoung  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2759adf08eSdyoung  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2859adf08eSdyoung  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2959adf08eSdyoung  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3059adf08eSdyoung  * POSSIBILITY OF SUCH DAMAGE.
3159adf08eSdyoung  */
3259adf08eSdyoung 
3359adf08eSdyoung /*
3459adf08eSdyoung  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
3559adf08eSdyoung  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
3659adf08eSdyoung  *
3759adf08eSdyoung  * Redistribution and use in source and binary forms, with or without
3859adf08eSdyoung  * modification, are permitted provided that the following conditions
3959adf08eSdyoung  * are met:
4059adf08eSdyoung  * 1. Redistributions of source code must retain the above copyright
4159adf08eSdyoung  *    notice, this list of conditions and the following disclaimer.
4259adf08eSdyoung  * 2. Redistributions in binary form must reproduce the above copyright
4359adf08eSdyoung  *    notice, this list of conditions and the following disclaimer in the
4459adf08eSdyoung  *    documentation and/or other materials provided with the distribution.
4559adf08eSdyoung  * 3. All advertising materials mentioning features or use of this software
4659adf08eSdyoung  *    must display the following acknowledgement:
4759adf08eSdyoung  *      This product includes software developed by Christopher G. Demetriou
4859adf08eSdyoung  *	for the NetBSD Project.
4959adf08eSdyoung  * 4. The name of the author may not be used to endorse or promote products
5059adf08eSdyoung  *    derived from this software without specific prior written permission
5159adf08eSdyoung  *
5259adf08eSdyoung  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
5359adf08eSdyoung  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
5459adf08eSdyoung  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
5559adf08eSdyoung  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
5659adf08eSdyoung  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
5759adf08eSdyoung  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
5859adf08eSdyoung  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
5959adf08eSdyoung  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
6059adf08eSdyoung  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
6159adf08eSdyoung  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
6259adf08eSdyoung  */
6359adf08eSdyoung 
642e13731dSmatt #ifndef _ARM_BUS_DEFS_H_
652e13731dSmatt #define _ARM_BUS_DEFS_H_
6659adf08eSdyoung 
6759adf08eSdyoung #if defined(_KERNEL_OPT)
6859adf08eSdyoung #include "opt_arm_bus_space.h"
6972d0b9e7Smaxv #include "opt_kasan.h"
7059adf08eSdyoung #endif
7159adf08eSdyoung 
7259adf08eSdyoung /*
7359adf08eSdyoung  * Addresses (in bus space).
7459adf08eSdyoung  */
7559adf08eSdyoung typedef u_long bus_addr_t;
7659adf08eSdyoung typedef u_long bus_size_t;
7759adf08eSdyoung 
7842993421Smatt #define	PRIxBUSADDR	"lx"
7942993421Smatt #define	PRIxBUSSIZE	"lx"
8042993421Smatt #define	PRIuBUSSIZE	"lu"
8142993421Smatt 
8259adf08eSdyoung /*
8359adf08eSdyoung  * Access methods for bus space.
8459adf08eSdyoung  */
8559adf08eSdyoung typedef struct bus_space *bus_space_tag_t;
8659adf08eSdyoung typedef u_long bus_space_handle_t;
8759adf08eSdyoung 
8842993421Smatt #define	PRIxBSH		"lx"
8942993421Smatt 
9059adf08eSdyoung /*
9159adf08eSdyoung  *	int bus_space_map(bus_space_tag_t t, bus_addr_t addr,
9259adf08eSdyoung  *	    bus_size_t size, int flags, bus_space_handle_t *bshp);
9359adf08eSdyoung  *
9459adf08eSdyoung  * Map a region of bus space.
9559adf08eSdyoung  */
9659adf08eSdyoung 
9759adf08eSdyoung #define	BUS_SPACE_MAP_CACHEABLE		0x01
9859adf08eSdyoung #define	BUS_SPACE_MAP_LINEAR		0x02
9959adf08eSdyoung #define	BUS_SPACE_MAP_PREFETCHABLE     	0x04
10059adf08eSdyoung 
101059f233aSjmcneill #define	BUS_SPACE_MAP_BUS1		0x0100
102059f233aSjmcneill #define	BUS_SPACE_MAP_BUS2		0x0200
103059f233aSjmcneill #define	BUS_SPACE_MAP_BUS3		0x0400
104059f233aSjmcneill #define	BUS_SPACE_MAP_BUS4		0x0800
105059f233aSjmcneill 
106*5158b98cSjmcneill #define	BUS_SPACE_MAP_NONPOSTED		BUS_SPACE_MAP_BUS1
107059f233aSjmcneill 
10859adf08eSdyoung struct bus_space {
10959adf08eSdyoung 	/* cookie */
11059adf08eSdyoung 	void		*bs_cookie;
11159adf08eSdyoung 
112fe33aa27Sryo 	/* used for aarch64. require ".bs_cookie = bus_space" */
113fe33aa27Sryo 	int		bs_stride;	/* offset <<= bs_stride (if needed) */
114fe33aa27Sryo 	int		bs_flags;
115fe33aa27Sryo 
11659adf08eSdyoung 	/* mapping/unmapping */
11759adf08eSdyoung 	int		(*bs_map)(void *, bus_addr_t, bus_size_t,
11859adf08eSdyoung 			    int, bus_space_handle_t *);
11959adf08eSdyoung 	void		(*bs_unmap)(void *, bus_space_handle_t,
12059adf08eSdyoung 			    bus_size_t);
12159adf08eSdyoung 	int		(*bs_subregion)(void *, bus_space_handle_t,
12259adf08eSdyoung 			    bus_size_t, bus_size_t, bus_space_handle_t *);
12359adf08eSdyoung 
12459adf08eSdyoung 	/* allocation/deallocation */
12559adf08eSdyoung 	int		(*bs_alloc)(void *, bus_addr_t, bus_addr_t,
12659adf08eSdyoung 			    bus_size_t, bus_size_t, bus_size_t, int,
12759adf08eSdyoung 			    bus_addr_t *, bus_space_handle_t *);
12859adf08eSdyoung 	void		(*bs_free)(void *, bus_space_handle_t,
12959adf08eSdyoung 			    bus_size_t);
13059adf08eSdyoung 
13159adf08eSdyoung 	/* get kernel virtual address */
13259adf08eSdyoung 	void *		(*bs_vaddr)(void *, bus_space_handle_t);
13359adf08eSdyoung 
13459adf08eSdyoung 	/* mmap bus space for user */
13559adf08eSdyoung 	paddr_t		(*bs_mmap)(void *, bus_addr_t, off_t, int, int);
13659adf08eSdyoung 
13759adf08eSdyoung 	/* barrier */
13859adf08eSdyoung 	void		(*bs_barrier)(void *, bus_space_handle_t,
13959adf08eSdyoung 			    bus_size_t, bus_size_t, int);
14059adf08eSdyoung 
14159adf08eSdyoung 	/* read (single) */
14208a4aba7Sskrll 	uint8_t		(*bs_r_1)(void *, bus_space_handle_t,
14359adf08eSdyoung 			    bus_size_t);
14408a4aba7Sskrll 	uint16_t	(*bs_r_2)(void *, bus_space_handle_t,
14559adf08eSdyoung 			    bus_size_t);
14608a4aba7Sskrll 	uint32_t	(*bs_r_4)(void *, bus_space_handle_t,
14759adf08eSdyoung 			    bus_size_t);
14808a4aba7Sskrll 	uint64_t	(*bs_r_8)(void *, bus_space_handle_t,
14959adf08eSdyoung 			    bus_size_t);
15059adf08eSdyoung 
15159adf08eSdyoung 	/* read multiple */
15259adf08eSdyoung 	void		(*bs_rm_1)(void *, bus_space_handle_t,
15308a4aba7Sskrll 			    bus_size_t, uint8_t *, bus_size_t);
15459adf08eSdyoung 	void		(*bs_rm_2)(void *, bus_space_handle_t,
15508a4aba7Sskrll 			    bus_size_t, uint16_t *, bus_size_t);
15659adf08eSdyoung 	void		(*bs_rm_4)(void *, bus_space_handle_t,
15708a4aba7Sskrll 			    bus_size_t, uint32_t *, bus_size_t);
15859adf08eSdyoung 	void		(*bs_rm_8)(void *, bus_space_handle_t,
15908a4aba7Sskrll 			    bus_size_t, uint64_t *, bus_size_t);
16059adf08eSdyoung 
16159adf08eSdyoung 	/* read region */
16259adf08eSdyoung 	void		(*bs_rr_1)(void *, bus_space_handle_t,
16308a4aba7Sskrll 			    bus_size_t, uint8_t *, bus_size_t);
16459adf08eSdyoung 	void		(*bs_rr_2)(void *, bus_space_handle_t,
16508a4aba7Sskrll 			    bus_size_t, uint16_t *, bus_size_t);
16659adf08eSdyoung 	void		(*bs_rr_4)(void *, bus_space_handle_t,
16708a4aba7Sskrll 			    bus_size_t, uint32_t *, bus_size_t);
16859adf08eSdyoung 	void		(*bs_rr_8)(void *, bus_space_handle_t,
16908a4aba7Sskrll 			    bus_size_t, uint64_t *, bus_size_t);
17059adf08eSdyoung 
17159adf08eSdyoung 	/* write (single) */
17259adf08eSdyoung 	void		(*bs_w_1)(void *, bus_space_handle_t,
17308a4aba7Sskrll 			    bus_size_t, uint8_t);
17459adf08eSdyoung 	void		(*bs_w_2)(void *, bus_space_handle_t,
17508a4aba7Sskrll 			    bus_size_t, uint16_t);
17659adf08eSdyoung 	void		(*bs_w_4)(void *, bus_space_handle_t,
17708a4aba7Sskrll 			    bus_size_t, uint32_t);
17859adf08eSdyoung 	void		(*bs_w_8)(void *, bus_space_handle_t,
17908a4aba7Sskrll 			    bus_size_t, uint64_t);
18059adf08eSdyoung 
18159adf08eSdyoung 	/* write multiple */
18259adf08eSdyoung 	void		(*bs_wm_1)(void *, bus_space_handle_t,
18308a4aba7Sskrll 			    bus_size_t, const uint8_t *, bus_size_t);
18459adf08eSdyoung 	void		(*bs_wm_2)(void *, bus_space_handle_t,
18508a4aba7Sskrll 			    bus_size_t, const uint16_t *, bus_size_t);
18659adf08eSdyoung 	void		(*bs_wm_4)(void *, bus_space_handle_t,
18708a4aba7Sskrll 			    bus_size_t, const uint32_t *, bus_size_t);
18859adf08eSdyoung 	void		(*bs_wm_8)(void *, bus_space_handle_t,
18908a4aba7Sskrll 			    bus_size_t, const uint64_t *, bus_size_t);
19059adf08eSdyoung 
19159adf08eSdyoung 	/* write region */
19259adf08eSdyoung 	void		(*bs_wr_1)(void *, bus_space_handle_t,
19308a4aba7Sskrll 			    bus_size_t, const uint8_t *, bus_size_t);
19459adf08eSdyoung 	void		(*bs_wr_2)(void *, bus_space_handle_t,
19508a4aba7Sskrll 			    bus_size_t, const uint16_t *, bus_size_t);
19659adf08eSdyoung 	void		(*bs_wr_4)(void *, bus_space_handle_t,
19708a4aba7Sskrll 			    bus_size_t, const uint32_t *, bus_size_t);
19859adf08eSdyoung 	void		(*bs_wr_8)(void *, bus_space_handle_t,
19908a4aba7Sskrll 			    bus_size_t, const uint64_t *, bus_size_t);
20059adf08eSdyoung 
20159adf08eSdyoung 	/* set multiple */
20259adf08eSdyoung 	void		(*bs_sm_1)(void *, bus_space_handle_t,
20308a4aba7Sskrll 			    bus_size_t, uint8_t, bus_size_t);
20459adf08eSdyoung 	void		(*bs_sm_2)(void *, bus_space_handle_t,
20508a4aba7Sskrll 			    bus_size_t, uint16_t, bus_size_t);
20659adf08eSdyoung 	void		(*bs_sm_4)(void *, bus_space_handle_t,
20708a4aba7Sskrll 			    bus_size_t, uint32_t, bus_size_t);
20859adf08eSdyoung 	void		(*bs_sm_8)(void *, bus_space_handle_t,
20908a4aba7Sskrll 			    bus_size_t, uint64_t, bus_size_t);
21059adf08eSdyoung 
21159adf08eSdyoung 	/* set region */
21259adf08eSdyoung 	void		(*bs_sr_1)(void *, bus_space_handle_t,
21308a4aba7Sskrll 			    bus_size_t, uint8_t, bus_size_t);
21459adf08eSdyoung 	void		(*bs_sr_2)(void *, bus_space_handle_t,
21508a4aba7Sskrll 			    bus_size_t, uint16_t, bus_size_t);
21659adf08eSdyoung 	void		(*bs_sr_4)(void *, bus_space_handle_t,
21708a4aba7Sskrll 			    bus_size_t, uint32_t, bus_size_t);
21859adf08eSdyoung 	void		(*bs_sr_8)(void *, bus_space_handle_t,
21908a4aba7Sskrll 			    bus_size_t, uint64_t, bus_size_t);
22059adf08eSdyoung 
22159adf08eSdyoung 	/* copy */
22259adf08eSdyoung 	void		(*bs_c_1)(void *, bus_space_handle_t, bus_size_t,
22359adf08eSdyoung 			    bus_space_handle_t, bus_size_t, bus_size_t);
22459adf08eSdyoung 	void		(*bs_c_2)(void *, bus_space_handle_t, bus_size_t,
22559adf08eSdyoung 			    bus_space_handle_t, bus_size_t, bus_size_t);
22659adf08eSdyoung 	void		(*bs_c_4)(void *, bus_space_handle_t, bus_size_t,
22759adf08eSdyoung 			    bus_space_handle_t, bus_size_t, bus_size_t);
22859adf08eSdyoung 	void		(*bs_c_8)(void *, bus_space_handle_t, bus_size_t,
22959adf08eSdyoung 			    bus_space_handle_t, bus_size_t, bus_size_t);
23059adf08eSdyoung 
23159adf08eSdyoung #ifdef __BUS_SPACE_HAS_STREAM_METHODS
23259adf08eSdyoung 	/* read stream (single) */
23308a4aba7Sskrll 	uint8_t		(*bs_r_1_s)(void *, bus_space_handle_t,
23459adf08eSdyoung 			    bus_size_t);
23508a4aba7Sskrll 	uint16_t	(*bs_r_2_s)(void *, bus_space_handle_t,
23659adf08eSdyoung 			    bus_size_t);
23708a4aba7Sskrll 	uint32_t	(*bs_r_4_s)(void *, bus_space_handle_t,
23859adf08eSdyoung 			    bus_size_t);
23908a4aba7Sskrll 	uint64_t	(*bs_r_8_s)(void *, bus_space_handle_t,
24059adf08eSdyoung 			    bus_size_t);
24159adf08eSdyoung 
24259adf08eSdyoung 	/* read multiple stream */
24359adf08eSdyoung 	void		(*bs_rm_1_s)(void *, bus_space_handle_t,
24408a4aba7Sskrll 			    bus_size_t, uint8_t *, bus_size_t);
24559adf08eSdyoung 	void		(*bs_rm_2_s)(void *, bus_space_handle_t,
24608a4aba7Sskrll 			    bus_size_t, uint16_t *, bus_size_t);
24759adf08eSdyoung 	void		(*bs_rm_4_s)(void *, bus_space_handle_t,
24808a4aba7Sskrll 			    bus_size_t, uint32_t *, bus_size_t);
24959adf08eSdyoung 	void		(*bs_rm_8_s)(void *, bus_space_handle_t,
25008a4aba7Sskrll 			    bus_size_t, uint64_t *, bus_size_t);
25159adf08eSdyoung 
25259adf08eSdyoung 	/* read region stream */
25359adf08eSdyoung 	void		(*bs_rr_1_s)(void *, bus_space_handle_t,
25408a4aba7Sskrll 			    bus_size_t, uint8_t *, bus_size_t);
25559adf08eSdyoung 	void		(*bs_rr_2_s)(void *, bus_space_handle_t,
25608a4aba7Sskrll 			    bus_size_t, uint16_t *, bus_size_t);
25759adf08eSdyoung 	void		(*bs_rr_4_s)(void *, bus_space_handle_t,
25808a4aba7Sskrll 			    bus_size_t, uint32_t *, bus_size_t);
25959adf08eSdyoung 	void		(*bs_rr_8_s)(void *, bus_space_handle_t,
26008a4aba7Sskrll 			    bus_size_t, uint64_t *, bus_size_t);
26159adf08eSdyoung 
26259adf08eSdyoung 	/* write stream (single) */
26359adf08eSdyoung 	void		(*bs_w_1_s)(void *, bus_space_handle_t,
26408a4aba7Sskrll 			    bus_size_t, uint8_t);
26559adf08eSdyoung 	void		(*bs_w_2_s)(void *, bus_space_handle_t,
26608a4aba7Sskrll 			    bus_size_t, uint16_t);
26759adf08eSdyoung 	void		(*bs_w_4_s)(void *, bus_space_handle_t,
26808a4aba7Sskrll 			    bus_size_t, uint32_t);
26959adf08eSdyoung 	void		(*bs_w_8_s)(void *, bus_space_handle_t,
27008a4aba7Sskrll 			    bus_size_t, uint64_t);
27159adf08eSdyoung 
27259adf08eSdyoung 	/* write multiple stream */
27359adf08eSdyoung 	void		(*bs_wm_1_s)(void *, bus_space_handle_t,
27408a4aba7Sskrll 			    bus_size_t, const uint8_t *, bus_size_t);
27559adf08eSdyoung 	void		(*bs_wm_2_s)(void *, bus_space_handle_t,
27608a4aba7Sskrll 			    bus_size_t, const uint16_t *, bus_size_t);
27759adf08eSdyoung 	void		(*bs_wm_4_s)(void *, bus_space_handle_t,
27808a4aba7Sskrll 			    bus_size_t, const uint32_t *, bus_size_t);
27959adf08eSdyoung 	void		(*bs_wm_8_s)(void *, bus_space_handle_t,
28008a4aba7Sskrll 			    bus_size_t, const uint64_t *, bus_size_t);
28159adf08eSdyoung 
28259adf08eSdyoung 	/* write region stream */
28359adf08eSdyoung 	void		(*bs_wr_1_s)(void *, bus_space_handle_t,
28408a4aba7Sskrll 			    bus_size_t, const uint8_t *, bus_size_t);
28559adf08eSdyoung 	void		(*bs_wr_2_s)(void *, bus_space_handle_t,
28608a4aba7Sskrll 			    bus_size_t, const uint16_t *, bus_size_t);
28759adf08eSdyoung 	void		(*bs_wr_4_s)(void *, bus_space_handle_t,
28808a4aba7Sskrll 			    bus_size_t, const uint32_t *, bus_size_t);
28959adf08eSdyoung 	void		(*bs_wr_8_s)(void *, bus_space_handle_t,
29008a4aba7Sskrll 			    bus_size_t, const uint64_t *, bus_size_t);
29159adf08eSdyoung #endif	/* __BUS_SPACE_HAS_STREAM_METHODS */
292fe33aa27Sryo 
293fe33aa27Sryo #ifdef __BUS_SPACE_HAS_PROBING_METHODS
294fe33aa27Sryo 	/* peek */
295fe33aa27Sryo 	int		(*bs_pe_1)(void *, bus_space_handle_t,
296fe33aa27Sryo 			    bus_size_t, uint8_t *);
297fe33aa27Sryo 	int		(*bs_pe_2)(void *, bus_space_handle_t,
298fe33aa27Sryo 			    bus_size_t, uint16_t *);
299fe33aa27Sryo 	int		(*bs_pe_4)(void *, bus_space_handle_t,
300fe33aa27Sryo 			    bus_size_t, uint32_t *);
301fe33aa27Sryo 	int		(*bs_pe_8)(void *, bus_space_handle_t,
302fe33aa27Sryo 			    bus_size_t, uint64_t *);
303fe33aa27Sryo 
304fe33aa27Sryo 	/* poke */
305fe33aa27Sryo 	int		(*bs_po_1)(void *, bus_space_handle_t,
306fe33aa27Sryo 			    bus_size_t, uint8_t);
307fe33aa27Sryo 	int		(*bs_po_2)(void *, bus_space_handle_t,
308fe33aa27Sryo 			    bus_size_t, uint16_t);
309fe33aa27Sryo 	int		(*bs_po_4)(void *, bus_space_handle_t,
310fe33aa27Sryo 			    bus_size_t, uint32_t);
311fe33aa27Sryo 	int		(*bs_po_8)(void *, bus_space_handle_t,
312fe33aa27Sryo 			    bus_size_t, uint64_t);
313fe33aa27Sryo #endif /* __BUS_SPACE_HAS_PROBING_METHODS */
31459adf08eSdyoung };
31559adf08eSdyoung 
31659adf08eSdyoung #define	BUS_SPACE_BARRIER_READ	0x01
31759adf08eSdyoung #define	BUS_SPACE_BARRIER_WRITE	0x02
31859adf08eSdyoung 
31959adf08eSdyoung #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
32059adf08eSdyoung 
32159adf08eSdyoung /* Bus Space DMA macros */
32259adf08eSdyoung 
32359adf08eSdyoung /*
32459adf08eSdyoung  * Flags used in various bus DMA methods.
32559adf08eSdyoung  */
32659adf08eSdyoung #define	BUS_DMA_WAITOK		0x000	/* safe to sleep (pseudo-flag) */
32759adf08eSdyoung #define	BUS_DMA_NOWAIT		0x001	/* not safe to sleep */
32859adf08eSdyoung #define	BUS_DMA_ALLOCNOW	0x002	/* perform resource allocation now */
32959adf08eSdyoung #define	BUS_DMA_COHERENT	0x004	/* hint: map memory DMA coherent */
33059adf08eSdyoung #define	BUS_DMA_STREAMING	0x008	/* hint: sequential, unidirectional */
33159adf08eSdyoung #define	BUS_DMA_BUS1		0x010	/* placeholders for bus functions... */
33259adf08eSdyoung #define	BUS_DMA_BUS2		0x020
33359adf08eSdyoung #define	BUS_DMA_BUS3		0x040
33459adf08eSdyoung #define	BUS_DMA_BUS4		0x080
33559adf08eSdyoung #define	BUS_DMA_READ		0x100	/* mapping is device -> memory only */
33659adf08eSdyoung #define	BUS_DMA_WRITE		0x200	/* mapping is memory -> device only */
33759adf08eSdyoung #define	BUS_DMA_NOCACHE		0x400	/* hint: map non-cached memory */
33859adf08eSdyoung 
33959adf08eSdyoung /*
34059adf08eSdyoung  * Private flags stored in the DMA map.
34159adf08eSdyoung  */
3424710b77fSmatt #define	_BUS_DMAMAP_COHERENT	0x10000	/* no cache flush necessary on sync */
343b16ce6adSmatt #define	_BUS_DMAMAP_IS_BOUNCING	0x20000 /* is bouncing current xfer */
34426b3d46dSmatt #define	_BUS_DMAMAP_NOALLOC	0x40000	/* don't alloc memory from this range */
34559adf08eSdyoung 
34659adf08eSdyoung /* Forwards needed by prototypes below. */
34759adf08eSdyoung struct mbuf;
34859adf08eSdyoung struct uio;
34959adf08eSdyoung 
35059adf08eSdyoung /*
35159adf08eSdyoung  * Operations performed by bus_dmamap_sync().
35259adf08eSdyoung  */
35359adf08eSdyoung #define	BUS_DMASYNC_PREREAD	0x01	/* pre-read synchronization */
35459adf08eSdyoung #define	BUS_DMASYNC_POSTREAD	0x02	/* post-read synchronization */
35559adf08eSdyoung #define	BUS_DMASYNC_PREWRITE	0x04	/* pre-write synchronization */
35659adf08eSdyoung #define	BUS_DMASYNC_POSTWRITE	0x08	/* post-write synchronization */
35759adf08eSdyoung 
35859adf08eSdyoung typedef struct arm32_bus_dma_tag	*bus_dma_tag_t;
35959adf08eSdyoung typedef struct arm32_bus_dmamap		*bus_dmamap_t;
36059adf08eSdyoung 
36159adf08eSdyoung #define BUS_DMA_TAG_VALID(t)    ((t) != (bus_dma_tag_t)0)
36259adf08eSdyoung 
36359adf08eSdyoung /*
36459adf08eSdyoung  *	bus_dma_segment_t
36559adf08eSdyoung  *
36659adf08eSdyoung  *	Describes a single contiguous DMA transaction.  Values
36759adf08eSdyoung  *	are suitable for programming into DMA registers.
36859adf08eSdyoung  */
36959adf08eSdyoung struct arm32_bus_dma_segment {
37059adf08eSdyoung 	/*
37159adf08eSdyoung 	 * PUBLIC MEMBERS: these are used by machine-independent code.
37259adf08eSdyoung 	 */
37359adf08eSdyoung 	bus_addr_t	ds_addr;	/* DMA address */
37459adf08eSdyoung 	bus_size_t	ds_len;		/* length of transfer */
375fe33aa27Sryo 
376fe33aa27Sryo 	/*
377fe33aa27Sryo 	 * PRIVATE MEMBERS:
378fe33aa27Sryo 	 */
379463cf12dSmatt 	uint32_t	_ds_flags;	/* _BUS_DMAMAP_COHERENT */
380dd2d3a9fSjmcneill 	paddr_t		_ds_paddr;	/* CPU address */
38159adf08eSdyoung };
38259adf08eSdyoung typedef struct arm32_bus_dma_segment	bus_dma_segment_t;
38359adf08eSdyoung 
38459adf08eSdyoung /*
38559adf08eSdyoung  *	arm32_dma_range
38659adf08eSdyoung  *
38759adf08eSdyoung  *	This structure describes a valid DMA range.
38859adf08eSdyoung  */
38959adf08eSdyoung struct arm32_dma_range {
39059adf08eSdyoung 	bus_addr_t	dr_sysbase;	/* system base address */
39159adf08eSdyoung 	bus_addr_t	dr_busbase;	/* appears here on bus */
39259adf08eSdyoung 	bus_size_t	dr_len;		/* length of range */
393463cf12dSmatt 	uint32_t	dr_flags;	/* flags for range */
39459adf08eSdyoung };
39559adf08eSdyoung 
39659adf08eSdyoung /*
39759adf08eSdyoung  *	bus_dma_tag_t
39859adf08eSdyoung  *
39959adf08eSdyoung  *	A machine-dependent opaque type describing the implementation of
40059adf08eSdyoung  *	DMA for a given bus.
40159adf08eSdyoung  */
40259adf08eSdyoung 
40359adf08eSdyoung struct arm32_bus_dma_tag {
40459adf08eSdyoung 	/*
40559adf08eSdyoung 	 * DMA range for this tag.  If the page doesn't fall within
40659adf08eSdyoung 	 * one of these ranges, an error is returned.  The caller
40759adf08eSdyoung 	 * may then decide what to do with the transfer.  If the
40859adf08eSdyoung 	 * range pointer is NULL, it is ignored.
40959adf08eSdyoung 	 */
41059adf08eSdyoung 	struct arm32_dma_range *_ranges;
41159adf08eSdyoung 	int _nranges;
41259adf08eSdyoung 
41359adf08eSdyoung 	/*
41459adf08eSdyoung 	 * Opaque cookie for use by back-end.
41559adf08eSdyoung 	 */
41659adf08eSdyoung 	void *_cookie;
41759adf08eSdyoung 
41859adf08eSdyoung 	/*
41959adf08eSdyoung 	 * DMA mapping methods.
42059adf08eSdyoung 	 */
42159adf08eSdyoung 	int	(*_dmamap_create)(bus_dma_tag_t, bus_size_t, int,
42259adf08eSdyoung 		    bus_size_t, bus_size_t, int, bus_dmamap_t *);
42359adf08eSdyoung 	void	(*_dmamap_destroy)(bus_dma_tag_t, bus_dmamap_t);
42459adf08eSdyoung 	int	(*_dmamap_load)(bus_dma_tag_t, bus_dmamap_t, void *,
42559adf08eSdyoung 		    bus_size_t, struct proc *, int);
42659adf08eSdyoung 	int	(*_dmamap_load_mbuf)(bus_dma_tag_t, bus_dmamap_t,
42759adf08eSdyoung 		    struct mbuf *, int);
42859adf08eSdyoung 	int	(*_dmamap_load_uio)(bus_dma_tag_t, bus_dmamap_t,
42959adf08eSdyoung 		    struct uio *, int);
43059adf08eSdyoung 	int	(*_dmamap_load_raw)(bus_dma_tag_t, bus_dmamap_t,
43159adf08eSdyoung 		    bus_dma_segment_t *, int, bus_size_t, int);
43259adf08eSdyoung 	void	(*_dmamap_unload)(bus_dma_tag_t, bus_dmamap_t);
43359adf08eSdyoung 	void	(*_dmamap_sync_pre)(bus_dma_tag_t, bus_dmamap_t,
43459adf08eSdyoung 		    bus_addr_t, bus_size_t, int);
43559adf08eSdyoung 	void	(*_dmamap_sync_post)(bus_dma_tag_t, bus_dmamap_t,
43659adf08eSdyoung 		    bus_addr_t, bus_size_t, int);
43759adf08eSdyoung 
43859adf08eSdyoung 	/*
43959adf08eSdyoung 	 * DMA memory utility functions.
44059adf08eSdyoung 	 */
44159adf08eSdyoung 	int	(*_dmamem_alloc)(bus_dma_tag_t, bus_size_t, bus_size_t,
44259adf08eSdyoung 		    bus_size_t, bus_dma_segment_t *, int, int *, int);
44359adf08eSdyoung 	void	(*_dmamem_free)(bus_dma_tag_t,
44459adf08eSdyoung 		    bus_dma_segment_t *, int);
44559adf08eSdyoung 	int	(*_dmamem_map)(bus_dma_tag_t, bus_dma_segment_t *,
44659adf08eSdyoung 		    int, size_t, void **, int);
44759adf08eSdyoung 	void	(*_dmamem_unmap)(bus_dma_tag_t, void *, size_t);
44859adf08eSdyoung 	paddr_t	(*_dmamem_mmap)(bus_dma_tag_t, bus_dma_segment_t *,
44959adf08eSdyoung 		    int, off_t, int, int);
4504710b77fSmatt 
4514710b77fSmatt 	/*
4524710b77fSmatt 	 * DMA tag utility functions
4534710b77fSmatt 	 */
4544710b77fSmatt 	int	(*_dmatag_subregion)(bus_dma_tag_t, bus_addr_t, bus_addr_t,
4554710b77fSmatt 		     bus_dma_tag_t *, int);
4564710b77fSmatt 	void	(*_dmatag_destroy)(bus_dma_tag_t);
4574710b77fSmatt 
4584710b77fSmatt 	/*
4594710b77fSmatt 	 * State for bounce buffers
4604710b77fSmatt 	 */
4614710b77fSmatt 	int	_tag_needs_free;
4624710b77fSmatt 	int	(*_may_bounce)(bus_dma_tag_t, bus_dmamap_t, int, int *);
46359adf08eSdyoung };
46459adf08eSdyoung 
46559adf08eSdyoung /*
46659adf08eSdyoung  *	bus_dmamap_t
46759adf08eSdyoung  *
46859adf08eSdyoung  *	Describes a DMA mapping.
46959adf08eSdyoung  */
47059adf08eSdyoung struct arm32_bus_dmamap {
47159adf08eSdyoung 	/*
47259adf08eSdyoung 	 * PRIVATE MEMBERS: not for use by machine-independent code.
47359adf08eSdyoung 	 */
47459adf08eSdyoung 	bus_size_t	_dm_size;	/* largest DMA transfer mappable */
47559adf08eSdyoung 	int		_dm_segcnt;	/* number of segs this map can map */
47659adf08eSdyoung 	bus_size_t	_dm_maxmaxsegsz; /* fixed largest possible segment */
47759adf08eSdyoung 	bus_size_t	_dm_boundary;	/* don't cross this */
47859adf08eSdyoung 	int		_dm_flags;	/* misc. flags */
47959adf08eSdyoung 
48059adf08eSdyoung 	void		*_dm_origbuf;	/* pointer to original buffer */
48159adf08eSdyoung 	int		_dm_buftype;	/* type of buffer */
48259adf08eSdyoung 	struct vmspace	*_dm_vmspace;	/* vmspace that owns the mapping */
48359adf08eSdyoung 
48459adf08eSdyoung 	void		*_dm_cookie;	/* cookie for bus-specific functions */
485dd2d3a9fSjmcneill 	void		*_dm_iommu;	/* cookie for iommu functions */
48659adf08eSdyoung 
48759adf08eSdyoung 	/*
48859adf08eSdyoung 	 * PUBLIC MEMBERS: these are used by machine-independent code.
48959adf08eSdyoung 	 */
49072d0b9e7Smaxv #if defined(KASAN)
49172d0b9e7Smaxv 	void		*dm_buf;
49272d0b9e7Smaxv 	bus_size_t	dm_buflen;
49372d0b9e7Smaxv 	int		dm_buftype;
49472d0b9e7Smaxv #endif
49559adf08eSdyoung 	bus_size_t	dm_maxsegsz;	/* largest possible segment */
49659adf08eSdyoung 	bus_size_t	dm_mapsize;	/* size of the mapping */
49759adf08eSdyoung 	int		dm_nsegs;	/* # valid segments in mapping */
49859adf08eSdyoung 	bus_dma_segment_t dm_segs[1];	/* segments; variable length */
49959adf08eSdyoung };
50059adf08eSdyoung 
50159adf08eSdyoung /* _dm_buftype */
5024710b77fSmatt #define	_BUS_DMA_BUFTYPE_INVALID	0
5034710b77fSmatt #define	_BUS_DMA_BUFTYPE_LINEAR		1
5044710b77fSmatt #define	_BUS_DMA_BUFTYPE_MBUF		2
5054710b77fSmatt #define	_BUS_DMA_BUFTYPE_UIO		3
5064710b77fSmatt #define	_BUS_DMA_BUFTYPE_RAW		4
50759adf08eSdyoung 
5084710b77fSmatt #ifdef _ARM32_BUS_DMA_PRIVATE
509e6a4e4ebSskrll #define	_BUS_AVAIL_END	(physical_end - 1)
5104710b77fSmatt /*
5114710b77fSmatt  * Cookie used for bounce buffers. A pointer to one of these it stashed in
5124710b77fSmatt  * the DMA map.
5134710b77fSmatt  */
5144710b77fSmatt struct arm32_bus_dma_cookie {
5154710b77fSmatt 	int	id_flags;		/* flags; see below */
5164710b77fSmatt 
5174710b77fSmatt 	/*
5184710b77fSmatt 	 * Information about the original buffer used during
5194710b77fSmatt 	 * DMA map syncs.  Note that origibuflen is only used
5204710b77fSmatt 	 * for ID_BUFTYPE_LINEAR.
5214710b77fSmatt 	 */
5224710b77fSmatt 	union {
5234710b77fSmatt 		void	*un_origbuf;		/* pointer to orig buffer if
5244710b77fSmatt 						   bouncing */
5254710b77fSmatt 		char	*un_linearbuf;
5264710b77fSmatt 		struct mbuf	*un_mbuf;
5274710b77fSmatt 		struct uio	*un_uio;
5284710b77fSmatt 	} id_origbuf_un;
5294710b77fSmatt #define	id_origbuf		id_origbuf_un.un_origbuf
5304710b77fSmatt #define	id_origlinearbuf	id_origbuf_un.un_linearbuf
5314710b77fSmatt #define	id_origmbuf		id_origbuf_un.un_mbuf
5324710b77fSmatt #define	id_origuio		id_origbuf_un.un_uio
5334710b77fSmatt 	bus_size_t id_origbuflen;	/* ...and size */
5344710b77fSmatt 
5354710b77fSmatt 	void	*id_bouncebuf;		/* pointer to the bounce buffer */
5364710b77fSmatt 	bus_size_t id_bouncebuflen;	/* ...and size */
5374710b77fSmatt 	int	id_nbouncesegs;		/* number of valid bounce segs */
5384710b77fSmatt 	bus_dma_segment_t id_bouncesegs[0]; /* array of bounce buffer
5394710b77fSmatt 					       physical memory segments */
5404710b77fSmatt };
5414710b77fSmatt 
5424710b77fSmatt /* id_flags */
5434710b77fSmatt #define	_BUS_DMA_IS_BOUNCING		0x04	/* is bouncing current xfer */
5444710b77fSmatt #define	_BUS_DMA_HAS_BOUNCE		0x02	/* has bounce buffers */
54559adf08eSdyoung #endif /* _ARM32_BUS_DMA_PRIVATE */
5464710b77fSmatt #define	_BUS_DMA_MIGHT_NEED_BOUNCE	0x01	/* may need bounce buffers */
54759adf08eSdyoung 
5482e13731dSmatt #endif /* _ARM_BUS_DEFS_H_ */
549