xref: /openbsd-src/sys/arch/i386/i386/bus_space.c (revision f4e7063748a2ac72b2bab4389c0a7efc72d82189)
1*f4e70637Sjsg /*	$OpenBSD: bus_space.c,v 1.10 2023/01/30 10:49:04 jsg Exp $ */
24868469aSoga /*-
34868469aSoga  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
44868469aSoga  * All rights reserved.
54868469aSoga  *
64868469aSoga  * This code is derived from software contributed to The NetBSD Foundation
74868469aSoga  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
84868469aSoga  * NASA Ames Research Center.
94868469aSoga  *
104868469aSoga  * Redistribution and use in source and binary forms, with or without
114868469aSoga  * modification, are permitted provided that the following conditions
124868469aSoga  * are met:
134868469aSoga  * 1. Redistributions of source code must retain the above copyright
144868469aSoga  *    notice, this list of conditions and the following disclaimer.
154868469aSoga  * 2. Redistributions in binary form must reproduce the above copyright
164868469aSoga  *    notice, this list of conditions and the following disclaimer in the
174868469aSoga  *    documentation and/or other materials provided with the distribution.
184868469aSoga  *
194868469aSoga  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
204868469aSoga  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
214868469aSoga  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
224868469aSoga  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
234868469aSoga  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
244868469aSoga  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
254868469aSoga  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
264868469aSoga  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
274868469aSoga  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
284868469aSoga  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
294868469aSoga  * POSSIBILITY OF SUCH DAMAGE.
304868469aSoga  */
314868469aSoga 
324868469aSoga /*
334868469aSoga  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
344868469aSoga  * Copyright (c) 1996 Jason R. Thorpe.  All rights reserved.
354868469aSoga  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
364868469aSoga  *
374868469aSoga  * Redistribution and use in source and binary forms, with or without
384868469aSoga  * modification, are permitted provided that the following conditions
394868469aSoga  * are met:
404868469aSoga  * 1. Redistributions of source code must retain the above copyright
414868469aSoga  *    notice, this list of conditions and the following disclaimer.
424868469aSoga  * 2. Redistributions in binary form must reproduce the above copyright
434868469aSoga  *    notice, this list of conditions and the following disclaimer in the
444868469aSoga  *    documentation and/or other materials provided with the distribution.
454868469aSoga  * 3. All advertising materials mentioning features or use of this software
464868469aSoga  *    must display the following acknowledgement:
474868469aSoga  *	This product includes software developed by Christopher G. Demetriou
484868469aSoga  *	for the NetBSD Project.
494868469aSoga  * 4. The name of the author may not be used to endorse or promote products
504868469aSoga  *    derived from this software without specific prior written permission
514868469aSoga  *
524868469aSoga  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
534868469aSoga  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
544868469aSoga  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
554868469aSoga  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
564868469aSoga  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
574868469aSoga  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
584868469aSoga  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
594868469aSoga  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
604868469aSoga  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
614868469aSoga  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
624868469aSoga  */
634868469aSoga 
644868469aSoga #include <sys/param.h>
654868469aSoga 
664868469aSoga #include <machine/bus.h>
674868469aSoga 
6880d7446cSsthen u_int8_t	i386_bus_space_io_read_1(bus_space_handle_t, bus_size_t);
6980d7446cSsthen u_int16_t	i386_bus_space_io_read_2(bus_space_handle_t, bus_size_t);
7080d7446cSsthen u_int32_t	i386_bus_space_io_read_4(bus_space_handle_t, bus_size_t);
7180d7446cSsthen 
7280d7446cSsthen void		i386_bus_space_io_read_multi_1(bus_space_handle_t, bus_size_t,
7380d7446cSsthen 		    u_int8_t *, bus_size_t);
7480d7446cSsthen void		i386_bus_space_io_read_multi_2(bus_space_handle_t, bus_size_t,
7580d7446cSsthen 		    u_int16_t *, bus_size_t);
7680d7446cSsthen void		i386_bus_space_io_read_multi_4(bus_space_handle_t, bus_size_t,
7780d7446cSsthen 		    u_int32_t *, bus_size_t);
7880d7446cSsthen 
7980d7446cSsthen void		i386_bus_space_io_read_region_1(bus_space_handle_t, bus_size_t,
8080d7446cSsthen 		    u_int8_t *, bus_size_t);
8180d7446cSsthen void		i386_bus_space_io_read_region_2(bus_space_handle_t, bus_size_t,
8280d7446cSsthen 		    u_int16_t *, bus_size_t);
8380d7446cSsthen void		i386_bus_space_io_read_region_4(bus_space_handle_t, bus_size_t,
8480d7446cSsthen 		    u_int32_t *, bus_size_t);
8580d7446cSsthen 
8680d7446cSsthen void		i386_bus_space_io_write_1(bus_space_handle_t, bus_size_t,
8780d7446cSsthen 		    u_int8_t);
8880d7446cSsthen void		i386_bus_space_io_write_2(bus_space_handle_t, bus_size_t,
8980d7446cSsthen 		    u_int16_t);
9080d7446cSsthen void		i386_bus_space_io_write_4(bus_space_handle_t, bus_size_t,
9180d7446cSsthen 		    u_int32_t);
9280d7446cSsthen 
9380d7446cSsthen void		i386_bus_space_io_write_multi_1(bus_space_handle_t,
9480d7446cSsthen 		    bus_size_t, const u_int8_t *, bus_size_t);
9580d7446cSsthen void		i386_bus_space_io_write_multi_2(bus_space_handle_t,
9680d7446cSsthen 		    bus_size_t, const u_int16_t *, bus_size_t);
9780d7446cSsthen void		i386_bus_space_io_write_multi_4(bus_space_handle_t,
9880d7446cSsthen 		    bus_size_t, const u_int32_t *, bus_size_t);
9980d7446cSsthen 
10080d7446cSsthen void		i386_bus_space_io_write_region_1(bus_space_handle_t,
10180d7446cSsthen 		    bus_size_t, const u_int8_t *, bus_size_t);
10280d7446cSsthen void		i386_bus_space_io_write_region_2(bus_space_handle_t,
10380d7446cSsthen 		    bus_size_t, const u_int16_t *, bus_size_t);
10480d7446cSsthen void		i386_bus_space_io_write_region_4(bus_space_handle_t,
10580d7446cSsthen 		    bus_size_t, const u_int32_t *, bus_size_t);
10680d7446cSsthen 
10780d7446cSsthen void		i386_bus_space_io_set_multi_1(bus_space_handle_t, bus_size_t,
10880d7446cSsthen 		    u_int8_t, size_t);
10980d7446cSsthen void		i386_bus_space_io_set_multi_2(bus_space_handle_t, bus_size_t,
11080d7446cSsthen 		    u_int16_t, size_t);
11180d7446cSsthen void		i386_bus_space_io_set_multi_4(bus_space_handle_t, bus_size_t,
11280d7446cSsthen 		    u_int32_t, size_t);
11380d7446cSsthen 
11480d7446cSsthen void		i386_bus_space_io_set_region_1(bus_space_handle_t, bus_size_t,
11580d7446cSsthen 		    u_int8_t, size_t);
11680d7446cSsthen void		i386_bus_space_io_set_region_2(bus_space_handle_t, bus_size_t,
11780d7446cSsthen 		    u_int16_t, size_t);
11880d7446cSsthen void		i386_bus_space_io_set_region_4(bus_space_handle_t, bus_size_t,
11980d7446cSsthen 		    u_int32_t, size_t);
12080d7446cSsthen 
12180d7446cSsthen void		i386_bus_space_io_copy_1(bus_space_handle_t, bus_size_t,
12280d7446cSsthen 		    bus_space_handle_t, bus_size_t, size_t);
12380d7446cSsthen void		i386_bus_space_io_copy_2(bus_space_handle_t, bus_size_t,
12480d7446cSsthen 		    bus_space_handle_t, bus_size_t, size_t);
12580d7446cSsthen void		i386_bus_space_io_copy_4(bus_space_handle_t, bus_size_t,
12680d7446cSsthen 		    bus_space_handle_t, bus_size_t, size_t);
12780d7446cSsthen 
12880d7446cSsthen void *		i386_bus_space_io_vaddr(bus_space_handle_t);
12980d7446cSsthen paddr_t		i386_bus_space_io_mmap(bus_addr_t, off_t, int, int);
13080d7446cSsthen 
13180d7446cSsthen const struct i386_bus_space_ops i386_bus_space_io_ops = {
13280d7446cSsthen 	i386_bus_space_io_read_1,
13380d7446cSsthen 	i386_bus_space_io_read_2,
13480d7446cSsthen 	i386_bus_space_io_read_4,
13580d7446cSsthen 	i386_bus_space_io_read_multi_1,
13680d7446cSsthen 	i386_bus_space_io_read_multi_2,
13780d7446cSsthen 	i386_bus_space_io_read_multi_4,
13880d7446cSsthen 	i386_bus_space_io_read_region_1,
13980d7446cSsthen 	i386_bus_space_io_read_region_2,
14080d7446cSsthen 	i386_bus_space_io_read_region_4,
14180d7446cSsthen 	i386_bus_space_io_write_1,
14280d7446cSsthen 	i386_bus_space_io_write_2,
14380d7446cSsthen 	i386_bus_space_io_write_4,
14480d7446cSsthen 	i386_bus_space_io_write_multi_1,
14580d7446cSsthen 	i386_bus_space_io_write_multi_2,
14680d7446cSsthen 	i386_bus_space_io_write_multi_4,
14780d7446cSsthen 	i386_bus_space_io_write_region_1,
14880d7446cSsthen 	i386_bus_space_io_write_region_2,
14980d7446cSsthen 	i386_bus_space_io_write_region_4,
15080d7446cSsthen 	i386_bus_space_io_set_multi_1,
15180d7446cSsthen 	i386_bus_space_io_set_multi_2,
15280d7446cSsthen 	i386_bus_space_io_set_multi_4,
15380d7446cSsthen 	i386_bus_space_io_set_region_1,
15480d7446cSsthen 	i386_bus_space_io_set_region_2,
15580d7446cSsthen 	i386_bus_space_io_set_region_4,
15680d7446cSsthen 	i386_bus_space_io_copy_1,
15780d7446cSsthen 	i386_bus_space_io_copy_2,
15880d7446cSsthen 	i386_bus_space_io_copy_4,
15980d7446cSsthen 	i386_bus_space_io_vaddr,
16080d7446cSsthen };
16180d7446cSsthen 
16280d7446cSsthen u_int8_t	i386_bus_space_mem_read_1(bus_space_handle_t, bus_size_t);
16380d7446cSsthen u_int16_t	i386_bus_space_mem_read_2(bus_space_handle_t, bus_size_t);
16480d7446cSsthen u_int32_t	i386_bus_space_mem_read_4(bus_space_handle_t, bus_size_t);
16580d7446cSsthen 
16680d7446cSsthen void		i386_bus_space_mem_read_multi_1(bus_space_handle_t, bus_size_t,
16780d7446cSsthen 		    u_int8_t *, bus_size_t);
16880d7446cSsthen void		i386_bus_space_mem_read_multi_2(bus_space_handle_t, bus_size_t,
16980d7446cSsthen 		    u_int16_t *, bus_size_t);
17080d7446cSsthen void		i386_bus_space_mem_read_multi_4(bus_space_handle_t, bus_size_t,
17180d7446cSsthen 		    u_int32_t *, bus_size_t);
17280d7446cSsthen 
17380d7446cSsthen void		i386_bus_space_mem_read_region_1(bus_space_handle_t, bus_size_t,
17480d7446cSsthen 		    u_int8_t *, bus_size_t);
17580d7446cSsthen void		i386_bus_space_mem_read_region_2(bus_space_handle_t, bus_size_t,
17680d7446cSsthen 		    u_int16_t *, bus_size_t);
17780d7446cSsthen void		i386_bus_space_mem_read_region_4(bus_space_handle_t, bus_size_t,
17880d7446cSsthen 		    u_int32_t *, bus_size_t);
17980d7446cSsthen 
18080d7446cSsthen void		i386_bus_space_mem_write_1(bus_space_handle_t, bus_size_t,
18180d7446cSsthen 		    u_int8_t);
18280d7446cSsthen void		i386_bus_space_mem_write_2(bus_space_handle_t, bus_size_t,
18380d7446cSsthen 		    u_int16_t);
18480d7446cSsthen void		i386_bus_space_mem_write_4(bus_space_handle_t, bus_size_t,
18580d7446cSsthen 		    u_int32_t);
18680d7446cSsthen 
18780d7446cSsthen void		i386_bus_space_mem_write_multi_1(bus_space_handle_t,
18880d7446cSsthen 		    bus_size_t, const u_int8_t *, bus_size_t);
18980d7446cSsthen void		i386_bus_space_mem_write_multi_2(bus_space_handle_t,
19080d7446cSsthen 		    bus_size_t, const u_int16_t *, bus_size_t);
19180d7446cSsthen void		i386_bus_space_mem_write_multi_4(bus_space_handle_t,
19280d7446cSsthen 		    bus_size_t, const u_int32_t *, bus_size_t);
19380d7446cSsthen 
19480d7446cSsthen void		i386_bus_space_mem_write_region_1(bus_space_handle_t,
19580d7446cSsthen 		    bus_size_t, const u_int8_t *, bus_size_t);
19680d7446cSsthen void		i386_bus_space_mem_write_region_2(bus_space_handle_t,
19780d7446cSsthen 		    bus_size_t, const u_int16_t *, bus_size_t);
19880d7446cSsthen void		i386_bus_space_mem_write_region_4(bus_space_handle_t,
19980d7446cSsthen 		    bus_size_t, const u_int32_t *, bus_size_t);
20080d7446cSsthen 
20180d7446cSsthen void		i386_bus_space_mem_set_multi_1(bus_space_handle_t, bus_size_t,
20280d7446cSsthen 		    u_int8_t, size_t);
20380d7446cSsthen void		i386_bus_space_mem_set_multi_2(bus_space_handle_t, bus_size_t,
20480d7446cSsthen 		    u_int16_t, size_t);
20580d7446cSsthen void		i386_bus_space_mem_set_multi_4(bus_space_handle_t, bus_size_t,
20680d7446cSsthen 		    u_int32_t, size_t);
20780d7446cSsthen 
20880d7446cSsthen void		i386_bus_space_mem_set_region_1(bus_space_handle_t, bus_size_t,
20980d7446cSsthen 		    u_int8_t, size_t);
21080d7446cSsthen void		i386_bus_space_mem_set_region_2(bus_space_handle_t, bus_size_t,
21180d7446cSsthen 		    u_int16_t, size_t);
21280d7446cSsthen void		i386_bus_space_mem_set_region_4(bus_space_handle_t, bus_size_t,
21380d7446cSsthen 		    u_int32_t, size_t);
21480d7446cSsthen 
21580d7446cSsthen void		i386_bus_space_mem_copy_1(bus_space_handle_t, bus_size_t,
21680d7446cSsthen 		    bus_space_handle_t, bus_size_t, size_t);
21780d7446cSsthen void		i386_bus_space_mem_copy_2(bus_space_handle_t, bus_size_t,
21880d7446cSsthen 		    bus_space_handle_t, bus_size_t, size_t);
21980d7446cSsthen void		i386_bus_space_mem_copy_4(bus_space_handle_t, bus_size_t,
22080d7446cSsthen 		    bus_space_handle_t, bus_size_t, size_t);
22180d7446cSsthen 
22280d7446cSsthen void *		i386_bus_space_mem_vaddr(bus_space_handle_t);
22380d7446cSsthen paddr_t		i386_bus_space_mem_mmap(bus_addr_t, off_t, int, int);
22480d7446cSsthen 
22580d7446cSsthen const struct i386_bus_space_ops i386_bus_space_mem_ops = {
22680d7446cSsthen 	i386_bus_space_mem_read_1,
22780d7446cSsthen 	i386_bus_space_mem_read_2,
22880d7446cSsthen 	i386_bus_space_mem_read_4,
22980d7446cSsthen 	i386_bus_space_mem_read_multi_1,
23080d7446cSsthen 	i386_bus_space_mem_read_multi_2,
23180d7446cSsthen 	i386_bus_space_mem_read_multi_4,
23280d7446cSsthen 	i386_bus_space_mem_read_region_1,
23380d7446cSsthen 	i386_bus_space_mem_read_region_2,
23480d7446cSsthen 	i386_bus_space_mem_read_region_4,
23580d7446cSsthen 	i386_bus_space_mem_write_1,
23680d7446cSsthen 	i386_bus_space_mem_write_2,
23780d7446cSsthen 	i386_bus_space_mem_write_4,
23880d7446cSsthen 	i386_bus_space_mem_write_multi_1,
23980d7446cSsthen 	i386_bus_space_mem_write_multi_2,
24080d7446cSsthen 	i386_bus_space_mem_write_multi_4,
24180d7446cSsthen 	i386_bus_space_mem_write_region_1,
24280d7446cSsthen 	i386_bus_space_mem_write_region_2,
24380d7446cSsthen 	i386_bus_space_mem_write_region_4,
24480d7446cSsthen 	i386_bus_space_mem_set_multi_1,
24580d7446cSsthen 	i386_bus_space_mem_set_multi_2,
24680d7446cSsthen 	i386_bus_space_mem_set_multi_4,
24780d7446cSsthen 	i386_bus_space_mem_set_region_1,
24880d7446cSsthen 	i386_bus_space_mem_set_region_2,
24980d7446cSsthen 	i386_bus_space_mem_set_region_4,
25080d7446cSsthen 	i386_bus_space_mem_copy_1,
25180d7446cSsthen 	i386_bus_space_mem_copy_2,
25280d7446cSsthen 	i386_bus_space_mem_copy_4,
25380d7446cSsthen 	i386_bus_space_mem_vaddr,
25480d7446cSsthen };
25580d7446cSsthen 
2564868469aSoga u_int8_t
i386_bus_space_io_read_1(bus_space_handle_t h,bus_size_t o)25780d7446cSsthen i386_bus_space_io_read_1(bus_space_handle_t h, bus_size_t o)
2584868469aSoga {
25980d7446cSsthen 	return (inb(h + o));
2604868469aSoga }
2614868469aSoga 
2624868469aSoga u_int16_t
i386_bus_space_io_read_2(bus_space_handle_t h,bus_size_t o)26380d7446cSsthen i386_bus_space_io_read_2(bus_space_handle_t h, bus_size_t o)
2644868469aSoga {
26580d7446cSsthen 	return (inw(h + o));
2664868469aSoga }
2674868469aSoga 
2684868469aSoga u_int32_t
i386_bus_space_io_read_4(bus_space_handle_t h,bus_size_t o)26980d7446cSsthen i386_bus_space_io_read_4(bus_space_handle_t h, bus_size_t o)
2704868469aSoga {
27180d7446cSsthen 	return (inl(h + o));
2724868469aSoga }
2734868469aSoga 
2744868469aSoga void
i386_bus_space_io_read_multi_1(bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t cnt)27580d7446cSsthen i386_bus_space_io_read_multi_1(bus_space_handle_t h, bus_size_t o,
2764868469aSoga     u_int8_t *a, bus_size_t cnt)
2774868469aSoga {
2784868469aSoga 	insb(h + o, a, cnt);
279e77b97d3Ssthen }
28085056c11Sdlg 
28185056c11Sdlg void
i386_bus_space_io_read_multi_2(bus_space_handle_t h,bus_size_t o,u_int16_t * a,bus_size_t cnt)28280d7446cSsthen i386_bus_space_io_read_multi_2(bus_space_handle_t h, bus_size_t o,
28385056c11Sdlg     u_int16_t *a, bus_size_t cnt)
28485056c11Sdlg {
285e77b97d3Ssthen 	insw(h + o, a, cnt);
286e77b97d3Ssthen }
28785056c11Sdlg 
28885056c11Sdlg void
i386_bus_space_io_read_multi_4(bus_space_handle_t h,bus_size_t o,u_int32_t * a,bus_size_t cnt)28980d7446cSsthen i386_bus_space_io_read_multi_4(bus_space_handle_t h, bus_size_t o,
29080d7446cSsthen     u_int32_t *a, bus_size_t cnt)
29180d7446cSsthen {
29280d7446cSsthen 	insl(h + o, a, cnt);
29380d7446cSsthen }
29480d7446cSsthen 
29580d7446cSsthen void
i386_bus_space_io_read_region_1(bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t cnt)29680d7446cSsthen i386_bus_space_io_read_region_1(bus_space_handle_t h,
29785056c11Sdlg     bus_size_t o, u_int8_t *a, bus_size_t cnt)
29885056c11Sdlg {
29985056c11Sdlg 	int _cnt = cnt;
30085056c11Sdlg 	void *_addr = a;
30185056c11Sdlg 	int _port = h + o;
30285056c11Sdlg 
303e39f036fSguenther 	__asm volatile(
304e77b97d3Ssthen 	"1:	inb %w2,%%al				;"
305e77b97d3Ssthen 	"	stosb					;"
306e77b97d3Ssthen 	"	incl %2					;"
307e77b97d3Ssthen 	"	loop 1b"				:
308e77b97d3Ssthen 	    "+D" (_addr), "+c" (_cnt), "+d" (_port)	::
309e77b97d3Ssthen 	    "%eax", "memory", "cc");
31085056c11Sdlg }
31185056c11Sdlg 
31285056c11Sdlg void
i386_bus_space_io_read_region_2(bus_space_handle_t h,bus_size_t o,u_int16_t * a,bus_size_t cnt)31380d7446cSsthen i386_bus_space_io_read_region_2(bus_space_handle_t h,
31485056c11Sdlg     bus_size_t o, u_int16_t *a, bus_size_t cnt)
31585056c11Sdlg {
31685056c11Sdlg 	int _cnt = cnt;
31785056c11Sdlg 	void *_addr = a;
31885056c11Sdlg 	int _port = h + o;
31985056c11Sdlg 
320e39f036fSguenther 	__asm volatile(
321e77b97d3Ssthen 	"1:	inw %w2,%%ax				;"
322e77b97d3Ssthen 	"	stosw					;"
323e77b97d3Ssthen 	"	addl $2,%2				;"
324e77b97d3Ssthen 	"	loop 1b"				:
325e77b97d3Ssthen 	    "+D" (_addr), "+c" (_cnt), "+d" (_port)	::
326e77b97d3Ssthen 	    "%eax", "memory", "cc");
32785056c11Sdlg }
32885056c11Sdlg 
32985056c11Sdlg void
i386_bus_space_io_read_region_4(bus_space_handle_t h,bus_size_t o,u_int32_t * a,bus_size_t cnt)33080d7446cSsthen i386_bus_space_io_read_region_4(bus_space_handle_t h,
33185056c11Sdlg     bus_size_t o, u_int32_t *a, bus_size_t cnt)
33285056c11Sdlg {
33385056c11Sdlg 	int _cnt = cnt;
33485056c11Sdlg 	void *_addr = a;
33585056c11Sdlg 	int _port = h + o;
33685056c11Sdlg 
337e39f036fSguenther 	__asm volatile(
338e77b97d3Ssthen 	"1:	inl %w2,%%eax				;"
339e77b97d3Ssthen 	"	stosl					;"
340e77b97d3Ssthen 	"	addl $4,%2				;"
341e77b97d3Ssthen 	"	loop 1b"				:
342e77b97d3Ssthen 	    "+D" (_addr), "+c" (_cnt), "+d" (_port)	::
343e77b97d3Ssthen 	    "%eax", "memory", "cc");
34485056c11Sdlg }
34585056c11Sdlg 
34685056c11Sdlg void
i386_bus_space_io_write_1(bus_space_handle_t h,bus_size_t o,u_int8_t v)34780d7446cSsthen i386_bus_space_io_write_1(bus_space_handle_t h, bus_size_t o, u_int8_t v)
34885056c11Sdlg {
349e77b97d3Ssthen 	outb(h + o, v);
35085056c11Sdlg }
35185056c11Sdlg 
35285056c11Sdlg void
i386_bus_space_io_write_2(bus_space_handle_t h,bus_size_t o,u_int16_t v)35380d7446cSsthen i386_bus_space_io_write_2(bus_space_handle_t h, bus_size_t o, u_int16_t v)
35485056c11Sdlg {
355e77b97d3Ssthen 	outw(h + o, v);
35685056c11Sdlg }
35785056c11Sdlg 
35885056c11Sdlg void
i386_bus_space_io_write_4(bus_space_handle_t h,bus_size_t o,u_int32_t v)35980d7446cSsthen i386_bus_space_io_write_4(bus_space_handle_t h, bus_size_t o, u_int32_t v)
36085056c11Sdlg {
361e77b97d3Ssthen 	outl(h + o, v);
36285056c11Sdlg }
36385056c11Sdlg 
36485056c11Sdlg void
i386_bus_space_io_write_multi_1(bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t cnt)36580d7446cSsthen i386_bus_space_io_write_multi_1(bus_space_handle_t h,
36685056c11Sdlg     bus_size_t o, const u_int8_t *a, bus_size_t cnt)
36785056c11Sdlg {
368e77b97d3Ssthen 	outsb(h + o, a, cnt);
369e77b97d3Ssthen }
37085056c11Sdlg 
37185056c11Sdlg void
i386_bus_space_io_write_multi_2(bus_space_handle_t h,bus_size_t o,const u_int16_t * a,bus_size_t cnt)37280d7446cSsthen i386_bus_space_io_write_multi_2(bus_space_handle_t h,
37385056c11Sdlg     bus_size_t o, const u_int16_t *a, bus_size_t cnt)
37485056c11Sdlg {
375e77b97d3Ssthen 	outsw(h + o, a, cnt);
37680d7446cSsthen }
37785056c11Sdlg 
37885056c11Sdlg void
i386_bus_space_io_write_multi_4(bus_space_handle_t h,bus_size_t o,const u_int32_t * a,bus_size_t cnt)37980d7446cSsthen i386_bus_space_io_write_multi_4(bus_space_handle_t h,
38085056c11Sdlg     bus_size_t o, const u_int32_t *a, bus_size_t cnt)
38185056c11Sdlg {
382e77b97d3Ssthen 	outsl(h + o, a, cnt);
383e77b97d3Ssthen }
38485056c11Sdlg 
38585056c11Sdlg void
i386_bus_space_io_write_region_1(bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t cnt)38680d7446cSsthen i386_bus_space_io_write_region_1(bus_space_handle_t h,
38785056c11Sdlg     bus_size_t o, const u_int8_t *a, bus_size_t cnt)
38885056c11Sdlg {
38985056c11Sdlg 	int _port = h + o;
39085056c11Sdlg 	const void *_addr = a;
39185056c11Sdlg 	int _cnt = cnt;
39285056c11Sdlg 
393e39f036fSguenther 	__asm volatile(
394e77b97d3Ssthen 	"1:	lodsb					;"
395e77b97d3Ssthen 	"	outb %%al,%w0				;"
396e77b97d3Ssthen 	"	incl %0					;"
397e77b97d3Ssthen 	"	loop 1b"				:
398e77b97d3Ssthen 	    "+d" (_port), "+S" (_addr), "+c" (_cnt)	::
399e77b97d3Ssthen 	    "%eax", "memory", "cc");
40085056c11Sdlg }
40185056c11Sdlg 
40285056c11Sdlg void
i386_bus_space_io_write_region_2(bus_space_handle_t h,bus_size_t o,const u_int16_t * a,bus_size_t cnt)40380d7446cSsthen i386_bus_space_io_write_region_2(bus_space_handle_t h,
40485056c11Sdlg     bus_size_t o, const u_int16_t *a, bus_size_t cnt)
40585056c11Sdlg {
40685056c11Sdlg 	int _port = h + o;
40785056c11Sdlg 	const void *_addr = a;
40885056c11Sdlg 	int _cnt = cnt;
40985056c11Sdlg 
410e39f036fSguenther 	__asm volatile(
411e77b97d3Ssthen 	"1:	lodsw					;"
412e77b97d3Ssthen 	"	outw %%ax,%w0				;"
413e77b97d3Ssthen 	"	addl $2,%0				;"
414e77b97d3Ssthen 	"	loop 1b"				:
415e77b97d3Ssthen 	    "+d" (_port), "+S" (_addr), "+c" (_cnt)	::
416e77b97d3Ssthen 	    "%eax", "memory", "cc");
41785056c11Sdlg }
41885056c11Sdlg 
41985056c11Sdlg void
i386_bus_space_io_write_region_4(bus_space_handle_t h,bus_size_t o,const u_int32_t * a,bus_size_t cnt)42080d7446cSsthen i386_bus_space_io_write_region_4(bus_space_handle_t h,
42185056c11Sdlg     bus_size_t o, const u_int32_t *a, bus_size_t cnt)
42285056c11Sdlg {
42385056c11Sdlg 	int _port = h + o;
42485056c11Sdlg 	const void *_addr = a;
42585056c11Sdlg 	int _cnt = cnt;
42685056c11Sdlg 
427e39f036fSguenther 	__asm volatile(
428e77b97d3Ssthen 	"1:	lodsl					;"
429e77b97d3Ssthen 	"	outl %%eax,%w0				;"
430e77b97d3Ssthen 	"	addl $4,%0				;"
431e77b97d3Ssthen 	"	loop 1b"				:
432e77b97d3Ssthen 	    "+d" (_port), "+S" (_addr), "+c" (_cnt)	::
433e77b97d3Ssthen 	    "%eax", "memory", "cc");
43485056c11Sdlg }
43585056c11Sdlg 
43685056c11Sdlg void
i386_bus_space_io_set_multi_1(bus_space_handle_t h,bus_size_t o,u_int8_t v,size_t cnt)43780d7446cSsthen i386_bus_space_io_set_multi_1(bus_space_handle_t h,
43885056c11Sdlg     bus_size_t o, u_int8_t v, size_t cnt)
43985056c11Sdlg {
44085056c11Sdlg 	int _cnt = cnt;
44185056c11Sdlg 
442e39f036fSguenther 	__asm volatile(
443e77b97d3Ssthen 	"1:	outb %b2, %w1				;"
444e77b97d3Ssthen 	"	loop 1b"				:
445e77b97d3Ssthen 	    "+c" (_cnt) : "d" (h + o), "a" (v)		:
446e77b97d3Ssthen 	    "cc");
447e77b97d3Ssthen }
44885056c11Sdlg 
44985056c11Sdlg void
i386_bus_space_io_set_multi_2(bus_space_handle_t h,bus_size_t o,u_int16_t v,size_t cnt)45080d7446cSsthen i386_bus_space_io_set_multi_2(bus_space_handle_t h,
45185056c11Sdlg     bus_size_t o, u_int16_t v, size_t cnt)
45285056c11Sdlg {
45385056c11Sdlg 	int _cnt = cnt;
45485056c11Sdlg 
455e39f036fSguenther 	__asm volatile(
456e77b97d3Ssthen 	"1:	outw %w2, %w1				;"
457e77b97d3Ssthen 	"	loop 1b"				:
458e77b97d3Ssthen 	    "+c" (_cnt) : "d" (h + o), "a" (v)	:
459e77b97d3Ssthen 	    "cc");
460e77b97d3Ssthen }
46185056c11Sdlg 
46285056c11Sdlg void
i386_bus_space_io_set_multi_4(bus_space_handle_t h,bus_size_t o,u_int32_t v,size_t cnt)46380d7446cSsthen i386_bus_space_io_set_multi_4(bus_space_handle_t h,
46485056c11Sdlg     bus_size_t o, u_int32_t v, size_t cnt)
46585056c11Sdlg {
46685056c11Sdlg 	int _cnt = cnt;
46785056c11Sdlg 
468e39f036fSguenther 	__asm volatile(
469e77b97d3Ssthen 	"1:	outl %2,%w1				;"
470e77b97d3Ssthen 	"	loop 1b"				:
471e77b97d3Ssthen 	    "+c" (_cnt) : "d" (h + o), "a" (v)	:
472e77b97d3Ssthen 		    "cc");
473e77b97d3Ssthen }
47485056c11Sdlg 
47585056c11Sdlg void
i386_bus_space_io_set_region_1(bus_space_handle_t h,bus_size_t o,u_int8_t v,size_t cnt)47680d7446cSsthen i386_bus_space_io_set_region_1(bus_space_handle_t h,
47785056c11Sdlg     bus_size_t o, u_int8_t v, size_t cnt)
47885056c11Sdlg {
47985056c11Sdlg 	int _port = h + o;
48085056c11Sdlg 	int _cnt = cnt;
48185056c11Sdlg 
482e77b97d3Ssthen 	__asm volatile(
483e77b97d3Ssthen 	"1:	outb %%al,%w0				;"
484e77b97d3Ssthen 	"	incl %0					;"
485e77b97d3Ssthen 	"	loop 1b"				:
486e77b97d3Ssthen 	    "+d" (_port), "+c" (_cnt) : "a" (v)	:
487e77b97d3Ssthen 		    "cc");
488e77b97d3Ssthen }
48985056c11Sdlg 
49085056c11Sdlg void
i386_bus_space_io_set_region_2(bus_space_handle_t h,bus_size_t o,u_int16_t v,size_t cnt)49180d7446cSsthen i386_bus_space_io_set_region_2(bus_space_handle_t h,
49285056c11Sdlg     bus_size_t o, u_int16_t v, size_t cnt)
49385056c11Sdlg {
49485056c11Sdlg 	int _port = h + o;
49585056c11Sdlg 	int _cnt = cnt;
49685056c11Sdlg 
497e77b97d3Ssthen 	__asm volatile(
498e77b97d3Ssthen 	"1:	outw %%ax,%w0				;"
499e77b97d3Ssthen 	"	addl $2, %0				;"
500e77b97d3Ssthen 	"	loop 1b"				:
501e77b97d3Ssthen 	    "+d" (_port), "+c" (_cnt) : "a" (v)		:
502e77b97d3Ssthen 		    "cc");
503e77b97d3Ssthen }
50485056c11Sdlg 
50585056c11Sdlg void
i386_bus_space_io_set_region_4(bus_space_handle_t h,bus_size_t o,u_int32_t v,size_t cnt)50680d7446cSsthen i386_bus_space_io_set_region_4(bus_space_handle_t h,
50785056c11Sdlg     bus_size_t o, u_int32_t v, size_t cnt)
50885056c11Sdlg {
50985056c11Sdlg 	int _port = h + o;
51085056c11Sdlg 	int _cnt = cnt;
51185056c11Sdlg 
512e77b97d3Ssthen 	__asm volatile(
513e77b97d3Ssthen 	"1:	outl %%eax,%w0				;"
514e77b97d3Ssthen 	"	addl $4, %0				;"
515e77b97d3Ssthen 	"	loop 1b"				:
516e77b97d3Ssthen 	    "+d" (_port), "+c" (_cnt) : "a" (v)		:
517e77b97d3Ssthen 	    "cc");
518e77b97d3Ssthen }
51985056c11Sdlg 
52085056c11Sdlg void
i386_bus_space_io_copy_1(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t cnt)52180d7446cSsthen i386_bus_space_io_copy_1(bus_space_handle_t h1, bus_size_t o1,
52285056c11Sdlg      bus_space_handle_t h2, bus_size_t o2, bus_size_t cnt)
52385056c11Sdlg {
52485056c11Sdlg 	int _port1 = h1 + o1;
52585056c11Sdlg 	int _port2 = h2 + o2;
52685056c11Sdlg 	int _cnt = cnt;
52785056c11Sdlg 
528e77b97d3Ssthen 	__asm volatile(
529e77b97d3Ssthen 	"1:	movl %k1,%%edx				;"
530e77b97d3Ssthen 	"	inb  %%dx,%%al				;"
531e77b97d3Ssthen 	"	movl %k0,%%edx				;"
532e77b97d3Ssthen 	"	outb %%al,%%dx				;"
533e77b97d3Ssthen 	"	incl %0					;"
534e77b97d3Ssthen 	"	incl %1					;"
535e77b97d3Ssthen 	"	loop 1b"				:
536e77b97d3Ssthen 	    "+D" (_port2), "+S" (_port1), "+c" (_cnt)	::
537e77b97d3Ssthen 	    "%edx", "%eax", "cc");
53885056c11Sdlg }
53985056c11Sdlg 
54085056c11Sdlg void
i386_bus_space_io_copy_2(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t cnt)54180d7446cSsthen i386_bus_space_io_copy_2(bus_space_handle_t h1, bus_size_t o1,
54285056c11Sdlg      bus_space_handle_t h2, bus_size_t o2, bus_size_t cnt)
54385056c11Sdlg {
54485056c11Sdlg 	int _port1 = h1 + o1;
54585056c11Sdlg 	int _port2 = h2 + o2;
54685056c11Sdlg 	int _cnt=cnt;
54780d7446cSsthen 
548e77b97d3Ssthen 	__asm volatile(
549e77b97d3Ssthen 	"1:	movl %k1,%%edx				;"
550e77b97d3Ssthen 	"	inw  %%dx,%%ax				;"
551e77b97d3Ssthen 	"	movl %k0,%%edx				;"
552e77b97d3Ssthen 	"	outw %%ax,%%dx				;"
553e77b97d3Ssthen 	"	addl $2, %0				;"
554e77b97d3Ssthen 	"	addl $2, %1				;"
555e77b97d3Ssthen 	"	loop 1b"				:
556e77b97d3Ssthen 	    "+D" (_port2), "+S" (_port1), "+c" (_cnt)	::
557e77b97d3Ssthen 	    "%edx", "%eax", "cc");
55885056c11Sdlg }
55985056c11Sdlg 
56085056c11Sdlg void
i386_bus_space_io_copy_4(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t cnt)56180d7446cSsthen i386_bus_space_io_copy_4(bus_space_handle_t h1, bus_size_t o1,
56285056c11Sdlg      bus_space_handle_t h2, bus_size_t o2, bus_size_t cnt)
56385056c11Sdlg {
56485056c11Sdlg 	int _port1 = h1 + o1;
56585056c11Sdlg 	int _port2 = h2 + o2;
56685056c11Sdlg 	int _cnt = cnt;
56785056c11Sdlg 
568e77b97d3Ssthen 	__asm volatile(
569e77b97d3Ssthen 	"1:	movl %k1,%%edx				;"
570e77b97d3Ssthen 	"	inl  %%dx,%%eax				;"
571e77b97d3Ssthen 	"	movl %k0,%%edx				;"
572e77b97d3Ssthen 	"	outl %%eax,%%dx				;"
573e77b97d3Ssthen 	"	addl $4, %0				;"
574e77b97d3Ssthen 	"	addl $4, %1				;"
575e77b97d3Ssthen 	"	loop 1b"				:
576e77b97d3Ssthen 	    "+D" (_port2), "+S" (_port1), "+c" (_cnt)	::
577e77b97d3Ssthen 	    "%edx", "%eax", "cc");
57880d7446cSsthen }
57980d7446cSsthen 
58080d7446cSsthen void *
i386_bus_space_io_vaddr(bus_space_handle_t h)58180d7446cSsthen i386_bus_space_io_vaddr(bus_space_handle_t h)
58280d7446cSsthen {
58380d7446cSsthen 	return (NULL);
58480d7446cSsthen }
58580d7446cSsthen 
58680d7446cSsthen paddr_t
i386_bus_space_io_mmap(bus_addr_t addr,off_t off,int prot,int flags)58780d7446cSsthen i386_bus_space_io_mmap(bus_addr_t addr, off_t off, int prot, int flags)
58880d7446cSsthen {
58980d7446cSsthen 	/* Can't mmap I/O space. */
59080d7446cSsthen 	return (-1);
59180d7446cSsthen }
59280d7446cSsthen 
59380d7446cSsthen u_int8_t
i386_bus_space_mem_read_1(bus_space_handle_t h,bus_size_t o)59480d7446cSsthen i386_bus_space_mem_read_1(bus_space_handle_t h, bus_size_t o)
59580d7446cSsthen {
59680d7446cSsthen 	return (*(volatile u_int8_t *)((h) + (o)));
59780d7446cSsthen }
59880d7446cSsthen 
59980d7446cSsthen u_int16_t
i386_bus_space_mem_read_2(bus_space_handle_t h,bus_size_t o)60080d7446cSsthen i386_bus_space_mem_read_2(bus_space_handle_t h, bus_size_t o)
60180d7446cSsthen {
60280d7446cSsthen 	return (*(volatile u_int16_t *)((h) + (o)));
60380d7446cSsthen }
60480d7446cSsthen 
60580d7446cSsthen u_int32_t
i386_bus_space_mem_read_4(bus_space_handle_t h,bus_size_t o)60680d7446cSsthen i386_bus_space_mem_read_4(bus_space_handle_t h, bus_size_t o)
60780d7446cSsthen {
60880d7446cSsthen 	return (*(volatile u_int32_t *)((h) + (o)));
60980d7446cSsthen }
61080d7446cSsthen 
61180d7446cSsthen void
i386_bus_space_mem_read_multi_1(bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t cnt)61280d7446cSsthen i386_bus_space_mem_read_multi_1(bus_space_handle_t h, bus_size_t o,
61380d7446cSsthen     u_int8_t *a, bus_size_t cnt)
61480d7446cSsthen {
61580d7446cSsthen 	void *_addr=a;
61680d7446cSsthen 	int _cnt=cnt;
617e39f036fSguenther 	__asm volatile(
61880d7446cSsthen 	"1:	movb (%2),%%al				;"
61980d7446cSsthen 	"	stosb					;"
62080d7446cSsthen 	"	loop 1b"				:
62180d7446cSsthen 	    "+D" (_addr), "+c" (_cnt) : "r" (h + o)	:
62280d7446cSsthen 	    "%eax", "memory", "cc");
62380d7446cSsthen }
62480d7446cSsthen 
62580d7446cSsthen void
i386_bus_space_mem_read_multi_2(bus_space_handle_t h,bus_size_t o,u_int16_t * a,bus_size_t cnt)62680d7446cSsthen i386_bus_space_mem_read_multi_2(bus_space_handle_t h, bus_size_t o,
62780d7446cSsthen     u_int16_t *a, bus_size_t cnt)
62880d7446cSsthen {
62980d7446cSsthen 	void *_addr=a;
63080d7446cSsthen 	int _cnt=cnt;
631e39f036fSguenther 	__asm volatile(
63280d7446cSsthen 	"1:	movw (%2),%%ax				;"
63380d7446cSsthen 	"	stosw					;"
63480d7446cSsthen 	"	loop 1b"				:
63580d7446cSsthen 	    "+D" (_addr), "+c" (_cnt) : "r" ((h) + (o))	:
63680d7446cSsthen 	    "%eax", "memory", "cc");
63780d7446cSsthen }
63880d7446cSsthen 
63980d7446cSsthen void
i386_bus_space_mem_read_multi_4(bus_space_handle_t h,bus_size_t o,u_int32_t * a,bus_size_t cnt)64080d7446cSsthen i386_bus_space_mem_read_multi_4(bus_space_handle_t h, bus_size_t o,
64180d7446cSsthen     u_int32_t *a, bus_size_t cnt)
64280d7446cSsthen {
64380d7446cSsthen 	void *_addr=a;
64480d7446cSsthen 	int _cnt=cnt;
645e39f036fSguenther 	__asm volatile(
64680d7446cSsthen 	"1:	movl (%2),%%eax				;"
64780d7446cSsthen 	"	stosl					;"
64880d7446cSsthen 	"	loop 1b"				:
64980d7446cSsthen 	    "+D" (_addr), "+c" (_cnt) : "r" (h + o)	:
65080d7446cSsthen 	    "%eax", "memory", "cc");
65180d7446cSsthen }
65280d7446cSsthen 
65380d7446cSsthen void
i386_bus_space_mem_read_region_1(bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t cnt)65480d7446cSsthen i386_bus_space_mem_read_region_1(bus_space_handle_t h,
65580d7446cSsthen     bus_size_t o, u_int8_t *a, bus_size_t cnt)
65680d7446cSsthen {
65780d7446cSsthen 	int _cnt = cnt;
65880d7446cSsthen 	void *_addr = a;
65980d7446cSsthen 	int _port = h + o;
66080d7446cSsthen 
66180d7446cSsthen 	i386_space_copy(_port, _addr, 1, _cnt);
66280d7446cSsthen }
66380d7446cSsthen 
66480d7446cSsthen void
i386_bus_space_mem_read_region_2(bus_space_handle_t h,bus_size_t o,u_int16_t * a,bus_size_t cnt)66580d7446cSsthen i386_bus_space_mem_read_region_2(bus_space_handle_t h,
66680d7446cSsthen     bus_size_t o, u_int16_t *a, bus_size_t cnt)
66780d7446cSsthen {
66880d7446cSsthen 	int _cnt = cnt;
66980d7446cSsthen 	void *_addr = a;
67080d7446cSsthen 	int _port = h + o;
67180d7446cSsthen 
67280d7446cSsthen 	i386_space_copy(_port, _addr, 2, _cnt);
67380d7446cSsthen }
67480d7446cSsthen 
67580d7446cSsthen void
i386_bus_space_mem_read_region_4(bus_space_handle_t h,bus_size_t o,u_int32_t * a,bus_size_t cnt)67680d7446cSsthen i386_bus_space_mem_read_region_4(bus_space_handle_t h,
67780d7446cSsthen     bus_size_t o, u_int32_t *a, bus_size_t cnt)
67880d7446cSsthen {
67980d7446cSsthen 	int _cnt = cnt;
68080d7446cSsthen 	void *_addr = a;
68180d7446cSsthen 	int _port = h + o;
68280d7446cSsthen 
68380d7446cSsthen 	i386_space_copy(_port, _addr, 4, _cnt);
68480d7446cSsthen }
68580d7446cSsthen 
68680d7446cSsthen void
i386_bus_space_mem_write_1(bus_space_handle_t h,bus_size_t o,u_int8_t v)68780d7446cSsthen i386_bus_space_mem_write_1(bus_space_handle_t h, bus_size_t o, u_int8_t v)
68880d7446cSsthen {
68980d7446cSsthen 	((void)(*(volatile u_int8_t *)(h + o) = v));
69080d7446cSsthen }
69180d7446cSsthen 
69280d7446cSsthen void
i386_bus_space_mem_write_2(bus_space_handle_t h,bus_size_t o,u_int16_t v)69380d7446cSsthen i386_bus_space_mem_write_2(bus_space_handle_t h, bus_size_t o, u_int16_t v)
69480d7446cSsthen {
69580d7446cSsthen 	((void)(*(volatile u_int16_t *)(h + o) = v));
69680d7446cSsthen }
69780d7446cSsthen 
69880d7446cSsthen void
i386_bus_space_mem_write_4(bus_space_handle_t h,bus_size_t o,u_int32_t v)69980d7446cSsthen i386_bus_space_mem_write_4(bus_space_handle_t h, bus_size_t o, u_int32_t v)
70080d7446cSsthen {
70180d7446cSsthen 	((void)(*(volatile u_int32_t *)(h + o) = v));
70280d7446cSsthen }
70380d7446cSsthen 
70480d7446cSsthen void
i386_bus_space_mem_write_multi_1(bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t cnt)70580d7446cSsthen i386_bus_space_mem_write_multi_1(bus_space_handle_t h,
70680d7446cSsthen     bus_size_t o, const u_int8_t *a, bus_size_t cnt)
70780d7446cSsthen {
70880d7446cSsthen 	const void *_addr=a;
70980d7446cSsthen 	int _cnt=cnt;
71080d7446cSsthen 
711e39f036fSguenther 	__asm volatile(
71280d7446cSsthen 	"1:	lodsb					;"
71380d7446cSsthen 	"	movb %%al,(%2)				;"
71480d7446cSsthen 	"	loop 1b"				:
71580d7446cSsthen 	    "+S" (_addr), "+c" (_cnt) : "r" (h + o)	:
71680d7446cSsthen 	    "%eax", "memory", "cc");
71780d7446cSsthen }
71880d7446cSsthen 
71980d7446cSsthen void
i386_bus_space_mem_write_multi_2(bus_space_handle_t h,bus_size_t o,const u_int16_t * a,bus_size_t cnt)72080d7446cSsthen i386_bus_space_mem_write_multi_2(bus_space_handle_t h,
72180d7446cSsthen     bus_size_t o, const u_int16_t *a, bus_size_t cnt)
72280d7446cSsthen {
72380d7446cSsthen 	const void *_addr = a;
72480d7446cSsthen 	int _cnt = cnt;
72580d7446cSsthen 
726e39f036fSguenther 	__asm volatile(
72780d7446cSsthen 	"1:	lodsw					;"
72880d7446cSsthen 	"	movw %%ax,(%2)				;"
72980d7446cSsthen 	"	loop 1b"				:
73080d7446cSsthen 	    "+S" (_addr), "+c" (_cnt) : "r" (h + o)	:
73180d7446cSsthen 	    "%eax", "memory", "cc");
73280d7446cSsthen }
73380d7446cSsthen 
73480d7446cSsthen void
i386_bus_space_mem_write_multi_4(bus_space_handle_t h,bus_size_t o,const u_int32_t * a,bus_size_t cnt)73580d7446cSsthen i386_bus_space_mem_write_multi_4(bus_space_handle_t h,
73680d7446cSsthen     bus_size_t o, const u_int32_t *a, bus_size_t cnt)
73780d7446cSsthen {
73880d7446cSsthen 	const void *_addr=a;
73980d7446cSsthen 	int _cnt=cnt;
74080d7446cSsthen 
741e39f036fSguenther 	__asm volatile(
74280d7446cSsthen 	"1:	lodsl					;"
74380d7446cSsthen 	"	movl %%eax,(%2)				;"
74480d7446cSsthen 	"	loop 1b"				:
74580d7446cSsthen 	    "+S" (_addr), "+c" (_cnt) : "r" (h + o)	:
74680d7446cSsthen 	    "%eax", "memory", "cc");
74780d7446cSsthen }
74880d7446cSsthen 
74980d7446cSsthen void
i386_bus_space_mem_write_region_1(bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t cnt)75080d7446cSsthen i386_bus_space_mem_write_region_1(bus_space_handle_t h,
75180d7446cSsthen     bus_size_t o, const u_int8_t *a, bus_size_t cnt)
75280d7446cSsthen {
75380d7446cSsthen 	int _port = h + o;
75480d7446cSsthen 	const void *_addr = a;
75580d7446cSsthen 	int _cnt = cnt;
75680d7446cSsthen 
75780d7446cSsthen 	i386_space_copy(_addr, _port, 1, _cnt);
75880d7446cSsthen }
75980d7446cSsthen 
76080d7446cSsthen void
i386_bus_space_mem_write_region_2(bus_space_handle_t h,bus_size_t o,const u_int16_t * a,bus_size_t cnt)76180d7446cSsthen i386_bus_space_mem_write_region_2(bus_space_handle_t h,
76280d7446cSsthen     bus_size_t o, const u_int16_t *a, bus_size_t cnt)
76380d7446cSsthen {
76480d7446cSsthen 	int _port = h + o;
76580d7446cSsthen 	const void *_addr = a;
76680d7446cSsthen 	int _cnt = cnt;
76780d7446cSsthen 
76880d7446cSsthen 	i386_space_copy(_addr, _port, 2, _cnt);
76980d7446cSsthen }
77080d7446cSsthen 
77180d7446cSsthen void
i386_bus_space_mem_write_region_4(bus_space_handle_t h,bus_size_t o,const u_int32_t * a,bus_size_t cnt)77280d7446cSsthen i386_bus_space_mem_write_region_4(bus_space_handle_t h,
77380d7446cSsthen     bus_size_t o, const u_int32_t *a, bus_size_t cnt)
77480d7446cSsthen {
77580d7446cSsthen 	int _port = h + o;
77680d7446cSsthen 	const void *_addr = a;
77780d7446cSsthen 	int _cnt = cnt;
77880d7446cSsthen 
77980d7446cSsthen 	i386_space_copy(_addr, _port, 4, _cnt);
78080d7446cSsthen }
78180d7446cSsthen 
78280d7446cSsthen void
i386_bus_space_mem_set_multi_1(bus_space_handle_t h,bus_size_t o,u_int8_t v,size_t cnt)78380d7446cSsthen i386_bus_space_mem_set_multi_1(bus_space_handle_t h,
78480d7446cSsthen     bus_size_t o, u_int8_t v, size_t cnt)
78580d7446cSsthen {
78680d7446cSsthen 	int _cnt = cnt;
78780d7446cSsthen 
788e39f036fSguenther 	__asm volatile(
78980d7446cSsthen 	"1:	movb %b2, (%1)				;"
79080d7446cSsthen 	"	loop 1b"				:
79180d7446cSsthen 	    "+c" (_cnt) : "D" (h + o), "a" (v)		:
79280d7446cSsthen 	    "cc", "memory");
79380d7446cSsthen }
79480d7446cSsthen 
79580d7446cSsthen void
i386_bus_space_mem_set_multi_2(bus_space_handle_t h,bus_size_t o,u_int16_t v,size_t cnt)79680d7446cSsthen i386_bus_space_mem_set_multi_2(bus_space_handle_t h,
79780d7446cSsthen     bus_size_t o, u_int16_t v, size_t cnt)
79880d7446cSsthen {
79980d7446cSsthen 	int _cnt = cnt;
80080d7446cSsthen 
801e39f036fSguenther 	__asm volatile(
80280d7446cSsthen 	"1:	movw %w2, (%1)				;"
80380d7446cSsthen 	"	loop 1b"				:
80480d7446cSsthen 	    "+c" (_cnt) : "D" (h + o), "a" (v)		:
80580d7446cSsthen 	    "cc", "memory");
80680d7446cSsthen }
80780d7446cSsthen 
80880d7446cSsthen void
i386_bus_space_mem_set_multi_4(bus_space_handle_t h,bus_size_t o,u_int32_t v,size_t cnt)80980d7446cSsthen i386_bus_space_mem_set_multi_4(bus_space_handle_t h,
81080d7446cSsthen     bus_size_t o, u_int32_t v, size_t cnt)
81180d7446cSsthen {
81280d7446cSsthen 	int _cnt = cnt;
81380d7446cSsthen 
814e39f036fSguenther 	__asm volatile(
81580d7446cSsthen 	"1:	movl %2,(%1)				;"
81680d7446cSsthen 	"	loop 1b"				:
81780d7446cSsthen 	    "+c" (_cnt) : "D" (h + o), "a" (v)	:
81880d7446cSsthen 	    "cc", "memory");
81980d7446cSsthen }
82080d7446cSsthen 
82180d7446cSsthen void
i386_bus_space_mem_set_region_1(bus_space_handle_t h,bus_size_t o,u_int8_t v,size_t cnt)82280d7446cSsthen i386_bus_space_mem_set_region_1(bus_space_handle_t h,
82380d7446cSsthen     bus_size_t o, u_int8_t v, size_t cnt)
82480d7446cSsthen {
82580d7446cSsthen 	int _port = h + o;
82680d7446cSsthen 	int _cnt = cnt;
82780d7446cSsthen 
828e39f036fSguenther 	__asm volatile(
82980d7446cSsthen 	"	repne					;"
83080d7446cSsthen 	"	stosb"					:
83180d7446cSsthen 	    "+D" (_port), "+c" (_cnt) : "a" (v)	:
83280d7446cSsthen 	    "memory", "cc");
83380d7446cSsthen }
83480d7446cSsthen 
83580d7446cSsthen void
i386_bus_space_mem_set_region_2(bus_space_handle_t h,bus_size_t o,u_int16_t v,size_t cnt)83680d7446cSsthen i386_bus_space_mem_set_region_2(bus_space_handle_t h,
83780d7446cSsthen     bus_size_t o, u_int16_t v, size_t cnt)
83880d7446cSsthen {
83980d7446cSsthen 	int _port = h + o;
84080d7446cSsthen 	int _cnt = cnt;
84180d7446cSsthen 
842e39f036fSguenther 	__asm volatile(
84380d7446cSsthen 	"	repne					;"
84480d7446cSsthen 	"	stosw"					:
84580d7446cSsthen 	    "+D" (_port), "+c" (_cnt) : "a" (v)	:
84680d7446cSsthen 	    "memory", "cc");
84780d7446cSsthen }
84880d7446cSsthen 
84980d7446cSsthen void
i386_bus_space_mem_set_region_4(bus_space_handle_t h,bus_size_t o,u_int32_t v,size_t cnt)85080d7446cSsthen i386_bus_space_mem_set_region_4(bus_space_handle_t h,
85180d7446cSsthen     bus_size_t o, u_int32_t v, size_t cnt)
85280d7446cSsthen {
85380d7446cSsthen 	int _port = h + o;
85480d7446cSsthen 	int _cnt = cnt;
85580d7446cSsthen 
856e39f036fSguenther 	__asm volatile(
85780d7446cSsthen 	"	repne					;"
85880d7446cSsthen 	"	stosl"					:
85980d7446cSsthen 	    "+D" (_port), "+c" (_cnt) : "a" (v)	:
86080d7446cSsthen 	    "memory", "cc");
86180d7446cSsthen }
86280d7446cSsthen 
86380d7446cSsthen void
i386_bus_space_mem_copy_1(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t cnt)86480d7446cSsthen i386_bus_space_mem_copy_1( bus_space_handle_t h1, bus_size_t o1,
86580d7446cSsthen      bus_space_handle_t h2, bus_size_t o2, bus_size_t cnt)
86680d7446cSsthen {
86780d7446cSsthen 	int _port1 = h1 + o1;
86880d7446cSsthen 	int _port2 = h2 + o2;
86980d7446cSsthen 	int _cnt = cnt;
87080d7446cSsthen 
87180d7446cSsthen 	i386_space_copy(_port1, _port2, 1, _cnt);
87280d7446cSsthen }
87380d7446cSsthen 
87480d7446cSsthen void
i386_bus_space_mem_copy_2(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t cnt)87580d7446cSsthen i386_bus_space_mem_copy_2( bus_space_handle_t h1, bus_size_t o1,
87680d7446cSsthen      bus_space_handle_t h2, bus_size_t o2, bus_size_t cnt)
87780d7446cSsthen {
87880d7446cSsthen 	int _port1 = h1 + o1;
87980d7446cSsthen 	int _port2 = h2 + o2;
88080d7446cSsthen 	int _cnt=cnt;
88180d7446cSsthen 
88280d7446cSsthen 	i386_space_copy(_port1, _port2, 2, _cnt);
88380d7446cSsthen }
88480d7446cSsthen 
88580d7446cSsthen void
i386_bus_space_mem_copy_4(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t cnt)88680d7446cSsthen i386_bus_space_mem_copy_4( bus_space_handle_t h1, bus_size_t o1,
88780d7446cSsthen      bus_space_handle_t h2, bus_size_t o2, bus_size_t cnt)
88880d7446cSsthen {
88980d7446cSsthen 	int _port1 = h1 + o1;
89080d7446cSsthen 	int _port2 = h2 + o2;
89180d7446cSsthen 	int _cnt = cnt;
89280d7446cSsthen 
8934868469aSoga 	i386_space_copy(_port1, _port2, 4, _cnt);
8944868469aSoga }
89580d7446cSsthen 
89680d7446cSsthen void *
i386_bus_space_mem_vaddr(bus_space_handle_t h)89780d7446cSsthen i386_bus_space_mem_vaddr(bus_space_handle_t h)
89880d7446cSsthen {
89980d7446cSsthen 	return ((void *)h);
90080d7446cSsthen }
90180d7446cSsthen 
90280d7446cSsthen paddr_t
i386_bus_space_mem_mmap(bus_addr_t addr,off_t off,int prot,int flags)90380d7446cSsthen i386_bus_space_mem_mmap(bus_addr_t addr, off_t off, int prot, int flags)
90480d7446cSsthen {
90580d7446cSsthen 	/*
90680d7446cSsthen 	 * "addr" is the base address of the device we're mapping.
90780d7446cSsthen 	 * "off" is the offset into that device.
90880d7446cSsthen 	 *
90980d7446cSsthen 	 * Note we are called for each "page" in the device that
91080d7446cSsthen 	 * the upper layers want to map.
91180d7446cSsthen 	 */
91280d7446cSsthen 	return (addr + off);
91380d7446cSsthen }
914