xref: /openbsd/sys/arch/amd64/amd64/bus_space.c (revision 36d473f7)
1*36d473f7Sguenther /*	$OpenBSD: bus_space.c,v 1.28 2022/11/29 21:41:39 guenther Exp $	*/
2f5df1827Smickey /*	$NetBSD: bus_space.c,v 1.2 2003/03/14 18:47:53 christos Exp $	*/
3f5df1827Smickey 
4f5df1827Smickey /*-
5f5df1827Smickey  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
6f5df1827Smickey  * All rights reserved.
7f5df1827Smickey  *
8f5df1827Smickey  * This code is derived from software contributed to The NetBSD Foundation
9f5df1827Smickey  * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace
10f5df1827Smickey  * Simulation Facility, NASA Ames Research Center.
11f5df1827Smickey  *
12f5df1827Smickey  * Redistribution and use in source and binary forms, with or without
13f5df1827Smickey  * modification, are permitted provided that the following conditions
14f5df1827Smickey  * are met:
15f5df1827Smickey  * 1. Redistributions of source code must retain the above copyright
16f5df1827Smickey  *    notice, this list of conditions and the following disclaimer.
17f5df1827Smickey  * 2. Redistributions in binary form must reproduce the above copyright
18f5df1827Smickey  *    notice, this list of conditions and the following disclaimer in the
19f5df1827Smickey  *    documentation and/or other materials provided with the distribution.
20f5df1827Smickey  *
21f5df1827Smickey  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22f5df1827Smickey  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23f5df1827Smickey  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24f5df1827Smickey  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25f5df1827Smickey  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26f5df1827Smickey  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27f5df1827Smickey  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28f5df1827Smickey  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29f5df1827Smickey  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30f5df1827Smickey  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31f5df1827Smickey  * POSSIBILITY OF SUCH DAMAGE.
32f5df1827Smickey  */
33f5df1827Smickey 
34f5df1827Smickey #include <sys/param.h>
35f5df1827Smickey #include <sys/systm.h>
36f5df1827Smickey #include <sys/malloc.h>
37f5df1827Smickey #include <sys/extent.h>
38f5df1827Smickey 
39f5df1827Smickey #include <uvm/uvm_extern.h>
40f5df1827Smickey 
41f5df1827Smickey #include <machine/bus.h>
42f5df1827Smickey 
43f5df1827Smickey #include <dev/isa/isareg.h>
44f5df1827Smickey #include <machine/isa_machdep.h>
45f5df1827Smickey 
46e12dfaa1Skettenis extern int pmap_initialized;
47e12dfaa1Skettenis 
48*36d473f7Sguenther /* kernel address of "hole" (location of start of iomem in virtual) */
49*36d473f7Sguenther u_long atdevbase = 0;
50*36d473f7Sguenther 
51f5df1827Smickey /*
52f5df1827Smickey  * Extent maps to manage I/O and memory space.  Allocate
5348cd2e59Smikeb  * storage for 16 regions in each, initially.  Later, ioport_malloc_safe
54f5df1827Smickey  * will indicate that it's safe to use malloc() to dynamically allocate
55f5df1827Smickey  * region descriptors.
56f5df1827Smickey  *
57f5df1827Smickey  * N.B. At least two regions are _always_ allocated from the iomem
58f5df1827Smickey  * extent map; (0 -> ISA hole) and (end of ISA hole -> end of RAM).
59f5df1827Smickey  *
60f5df1827Smickey  * The extent maps are not static!  Machine-dependent ISA and EISA
61f5df1827Smickey  * routines need access to them for bus address space allocation.
62f5df1827Smickey  */
6348cd2e59Smikeb static	long ioport_ex_storage[EXTENT_FIXED_STORAGE_SIZE(16) / sizeof(long)];
6448cd2e59Smikeb static	long iomem_ex_storage[EXTENT_FIXED_STORAGE_SIZE(16) / sizeof(long)];
65f5df1827Smickey struct	extent *ioport_ex;
66f5df1827Smickey struct	extent *iomem_ex;
67f5df1827Smickey static	int ioport_malloc_safe;
68f5df1827Smickey 
69f5df1827Smickey int	x86_mem_add_mapping(bus_addr_t, bus_size_t,
70f5df1827Smickey 	    int, bus_space_handle_t *);
71f5df1827Smickey 
7293c7b57cSdlg u_int8_t	x86_bus_space_io_read_1(bus_space_handle_t, bus_size_t);
7393c7b57cSdlg u_int16_t	x86_bus_space_io_read_2(bus_space_handle_t, bus_size_t);
7493c7b57cSdlg u_int32_t	x86_bus_space_io_read_4(bus_space_handle_t, bus_size_t);
7593c7b57cSdlg u_int64_t	x86_bus_space_io_read_8(bus_space_handle_t, bus_size_t);
7693c7b57cSdlg 
7793c7b57cSdlg void		x86_bus_space_io_read_multi_1(bus_space_handle_t, bus_size_t,
7893c7b57cSdlg 		    u_int8_t *, bus_size_t);
7993c7b57cSdlg void		x86_bus_space_io_read_multi_2(bus_space_handle_t, bus_size_t,
8093c7b57cSdlg 		    u_int16_t *, bus_size_t);
8193c7b57cSdlg void		x86_bus_space_io_read_multi_4(bus_space_handle_t, bus_size_t,
8293c7b57cSdlg 		    u_int32_t *, bus_size_t);
8393c7b57cSdlg void		x86_bus_space_io_read_multi_8(bus_space_handle_t, bus_size_t,
8493c7b57cSdlg 		    u_int64_t *, bus_size_t);
8593c7b57cSdlg 
8693c7b57cSdlg void		x86_bus_space_io_read_region_1(bus_space_handle_t, bus_size_t,
8793c7b57cSdlg 		    u_int8_t *, bus_size_t);
8893c7b57cSdlg void		x86_bus_space_io_read_region_2(bus_space_handle_t, bus_size_t,
8993c7b57cSdlg 		    u_int16_t *, bus_size_t);
9093c7b57cSdlg void		x86_bus_space_io_read_region_4(bus_space_handle_t, bus_size_t,
9193c7b57cSdlg 		    u_int32_t *, bus_size_t);
9293c7b57cSdlg void		x86_bus_space_io_read_region_8(bus_space_handle_t, bus_size_t,
9393c7b57cSdlg 		    u_int64_t *, bus_size_t);
9493c7b57cSdlg 
9593c7b57cSdlg void		x86_bus_space_io_write_1(bus_space_handle_t, bus_size_t,
9693c7b57cSdlg 		    u_int8_t);
9793c7b57cSdlg void		x86_bus_space_io_write_2(bus_space_handle_t, bus_size_t,
9893c7b57cSdlg 		    u_int16_t);
9993c7b57cSdlg void		x86_bus_space_io_write_4(bus_space_handle_t, bus_size_t,
10093c7b57cSdlg 		    u_int32_t);
10193c7b57cSdlg void		x86_bus_space_io_write_8(bus_space_handle_t, bus_size_t,
10293c7b57cSdlg 		    u_int64_t);
10393c7b57cSdlg 
10493c7b57cSdlg void		x86_bus_space_io_write_multi_1(bus_space_handle_t,
10593c7b57cSdlg 		    bus_size_t, const u_int8_t *, bus_size_t);
10693c7b57cSdlg void		x86_bus_space_io_write_multi_2(bus_space_handle_t,
10793c7b57cSdlg 		    bus_size_t, const u_int16_t *, bus_size_t);
10893c7b57cSdlg void		x86_bus_space_io_write_multi_4(bus_space_handle_t,
10993c7b57cSdlg 		    bus_size_t, const u_int32_t *, bus_size_t);
11093c7b57cSdlg void		x86_bus_space_io_write_multi_8(bus_space_handle_t,
11193c7b57cSdlg 		    bus_size_t, const u_int64_t *, bus_size_t);
11293c7b57cSdlg 
11393c7b57cSdlg void		x86_bus_space_io_write_region_1(bus_space_handle_t,
11493c7b57cSdlg 		    bus_size_t, const u_int8_t *, bus_size_t);
11593c7b57cSdlg void		x86_bus_space_io_write_region_2(bus_space_handle_t,
11693c7b57cSdlg 		    bus_size_t, const u_int16_t *, bus_size_t);
11793c7b57cSdlg void		x86_bus_space_io_write_region_4(bus_space_handle_t,
11893c7b57cSdlg 		    bus_size_t, const u_int32_t *, bus_size_t);
11993c7b57cSdlg void		x86_bus_space_io_write_region_8(bus_space_handle_t,
12093c7b57cSdlg 		    bus_size_t, const u_int64_t *, bus_size_t);
12193c7b57cSdlg 
12293c7b57cSdlg void		x86_bus_space_io_set_multi_1(bus_space_handle_t, bus_size_t,
12393c7b57cSdlg 		    u_int8_t, size_t);
12493c7b57cSdlg void		x86_bus_space_io_set_multi_2(bus_space_handle_t, bus_size_t,
12593c7b57cSdlg 		    u_int16_t, size_t);
12693c7b57cSdlg void		x86_bus_space_io_set_multi_4(bus_space_handle_t, bus_size_t,
12793c7b57cSdlg 		    u_int32_t, size_t);
12893c7b57cSdlg void		x86_bus_space_io_set_multi_8(bus_space_handle_t, bus_size_t,
12993c7b57cSdlg 		    u_int64_t, size_t);
13093c7b57cSdlg 
13193c7b57cSdlg void		x86_bus_space_io_set_region_1(bus_space_handle_t, bus_size_t,
13293c7b57cSdlg 		    u_int8_t, size_t);
13393c7b57cSdlg void		x86_bus_space_io_set_region_2(bus_space_handle_t, bus_size_t,
13493c7b57cSdlg 		    u_int16_t, size_t);
13593c7b57cSdlg void		x86_bus_space_io_set_region_4(bus_space_handle_t, bus_size_t,
13693c7b57cSdlg 		    u_int32_t, size_t);
13793c7b57cSdlg void		x86_bus_space_io_set_region_8(bus_space_handle_t, bus_size_t,
13893c7b57cSdlg 		    u_int64_t, size_t);
13993c7b57cSdlg 
14093c7b57cSdlg void		x86_bus_space_io_copy_1(bus_space_handle_t, bus_size_t,
14193c7b57cSdlg 		    bus_space_handle_t, bus_size_t, size_t);
14293c7b57cSdlg void		x86_bus_space_io_copy_2(bus_space_handle_t, bus_size_t,
14393c7b57cSdlg 		    bus_space_handle_t, bus_size_t, size_t);
14493c7b57cSdlg void		x86_bus_space_io_copy_4(bus_space_handle_t, bus_size_t,
14593c7b57cSdlg 		    bus_space_handle_t, bus_size_t, size_t);
14693c7b57cSdlg void		x86_bus_space_io_copy_8(bus_space_handle_t, bus_size_t,
14793c7b57cSdlg 		    bus_space_handle_t, bus_size_t, size_t);
14893c7b57cSdlg 
14993c7b57cSdlg void *		x86_bus_space_io_vaddr(bus_space_handle_t);
15093c7b57cSdlg paddr_t		x86_bus_space_io_mmap(bus_addr_t, off_t, int, int);
15193c7b57cSdlg 
15293c7b57cSdlg const struct x86_bus_space_ops x86_bus_space_io_ops = {
15393c7b57cSdlg 	x86_bus_space_io_read_1,
15493c7b57cSdlg 	x86_bus_space_io_read_2,
15593c7b57cSdlg 	x86_bus_space_io_read_4,
15693c7b57cSdlg 	x86_bus_space_io_read_8,
15793c7b57cSdlg 	x86_bus_space_io_read_multi_1,
15893c7b57cSdlg 	x86_bus_space_io_read_multi_2,
15993c7b57cSdlg 	x86_bus_space_io_read_multi_4,
16093c7b57cSdlg 	x86_bus_space_io_read_multi_8,
16193c7b57cSdlg 	x86_bus_space_io_read_region_1,
16293c7b57cSdlg 	x86_bus_space_io_read_region_2,
16393c7b57cSdlg 	x86_bus_space_io_read_region_4,
16493c7b57cSdlg 	x86_bus_space_io_read_region_8,
16593c7b57cSdlg 	x86_bus_space_io_write_1,
16693c7b57cSdlg 	x86_bus_space_io_write_2,
16793c7b57cSdlg 	x86_bus_space_io_write_4,
16893c7b57cSdlg 	x86_bus_space_io_write_8,
16993c7b57cSdlg 	x86_bus_space_io_write_multi_1,
17093c7b57cSdlg 	x86_bus_space_io_write_multi_2,
17193c7b57cSdlg 	x86_bus_space_io_write_multi_4,
17293c7b57cSdlg 	x86_bus_space_io_write_multi_8,
17393c7b57cSdlg 	x86_bus_space_io_write_region_1,
17493c7b57cSdlg 	x86_bus_space_io_write_region_2,
17593c7b57cSdlg 	x86_bus_space_io_write_region_4,
17693c7b57cSdlg 	x86_bus_space_io_write_region_8,
17793c7b57cSdlg 	x86_bus_space_io_set_multi_1,
17893c7b57cSdlg 	x86_bus_space_io_set_multi_2,
17993c7b57cSdlg 	x86_bus_space_io_set_multi_4,
18093c7b57cSdlg 	x86_bus_space_io_set_multi_8,
18193c7b57cSdlg 	x86_bus_space_io_set_region_1,
18293c7b57cSdlg 	x86_bus_space_io_set_region_2,
18393c7b57cSdlg 	x86_bus_space_io_set_region_4,
18493c7b57cSdlg 	x86_bus_space_io_set_region_8,
18593c7b57cSdlg 	x86_bus_space_io_copy_1,
18693c7b57cSdlg 	x86_bus_space_io_copy_2,
18793c7b57cSdlg 	x86_bus_space_io_copy_4,
18893c7b57cSdlg 	x86_bus_space_io_copy_8,
18993c7b57cSdlg 	x86_bus_space_io_vaddr,
19093c7b57cSdlg 	x86_bus_space_io_mmap
19193c7b57cSdlg };
19293c7b57cSdlg 
19393c7b57cSdlg u_int8_t	x86_bus_space_mem_read_1(bus_space_handle_t, bus_size_t);
19493c7b57cSdlg u_int16_t	x86_bus_space_mem_read_2(bus_space_handle_t, bus_size_t);
19593c7b57cSdlg u_int32_t	x86_bus_space_mem_read_4(bus_space_handle_t, bus_size_t);
19693c7b57cSdlg u_int64_t	x86_bus_space_mem_read_8(bus_space_handle_t, bus_size_t);
19793c7b57cSdlg 
19893c7b57cSdlg void		x86_bus_space_mem_read_multi_1(bus_space_handle_t, bus_size_t,
19993c7b57cSdlg 		    u_int8_t *, bus_size_t);
20093c7b57cSdlg void		x86_bus_space_mem_read_multi_2(bus_space_handle_t, bus_size_t,
20193c7b57cSdlg 		    u_int16_t *, bus_size_t);
20293c7b57cSdlg void		x86_bus_space_mem_read_multi_4(bus_space_handle_t, bus_size_t,
20393c7b57cSdlg 		    u_int32_t *, bus_size_t);
20493c7b57cSdlg void		x86_bus_space_mem_read_multi_8(bus_space_handle_t, bus_size_t,
20593c7b57cSdlg 		    u_int64_t *, bus_size_t);
20693c7b57cSdlg 
20793c7b57cSdlg void		x86_bus_space_mem_read_region_1(bus_space_handle_t, bus_size_t,
20893c7b57cSdlg 		    u_int8_t *, bus_size_t);
20993c7b57cSdlg void		x86_bus_space_mem_read_region_2(bus_space_handle_t, bus_size_t,
21093c7b57cSdlg 		    u_int16_t *, bus_size_t);
21193c7b57cSdlg void		x86_bus_space_mem_read_region_4(bus_space_handle_t, bus_size_t,
21293c7b57cSdlg 		    u_int32_t *, bus_size_t);
21393c7b57cSdlg void		x86_bus_space_mem_read_region_8(bus_space_handle_t, bus_size_t,
21493c7b57cSdlg 		    u_int64_t *, bus_size_t);
21593c7b57cSdlg 
21693c7b57cSdlg void		x86_bus_space_mem_write_1(bus_space_handle_t, bus_size_t,
21793c7b57cSdlg 		    u_int8_t);
21893c7b57cSdlg void		x86_bus_space_mem_write_2(bus_space_handle_t, bus_size_t,
21993c7b57cSdlg 		    u_int16_t);
22093c7b57cSdlg void		x86_bus_space_mem_write_4(bus_space_handle_t, bus_size_t,
22193c7b57cSdlg 		    u_int32_t);
22293c7b57cSdlg void		x86_bus_space_mem_write_8(bus_space_handle_t, bus_size_t,
22393c7b57cSdlg 		    u_int64_t);
22493c7b57cSdlg 
22593c7b57cSdlg void		x86_bus_space_mem_write_multi_1(bus_space_handle_t,
22693c7b57cSdlg 		    bus_size_t, const u_int8_t *, bus_size_t);
22793c7b57cSdlg void		x86_bus_space_mem_write_multi_2(bus_space_handle_t,
22893c7b57cSdlg 		    bus_size_t, const u_int16_t *, bus_size_t);
22993c7b57cSdlg void		x86_bus_space_mem_write_multi_4(bus_space_handle_t,
23093c7b57cSdlg 		    bus_size_t, const u_int32_t *, bus_size_t);
23193c7b57cSdlg void		x86_bus_space_mem_write_multi_8(bus_space_handle_t,
23293c7b57cSdlg 		    bus_size_t, const u_int64_t *, bus_size_t);
23393c7b57cSdlg 
23493c7b57cSdlg void		x86_bus_space_mem_write_region_1(bus_space_handle_t,
23593c7b57cSdlg 		    bus_size_t, const u_int8_t *, bus_size_t);
23693c7b57cSdlg void		x86_bus_space_mem_write_region_2(bus_space_handle_t,
23793c7b57cSdlg 		    bus_size_t, const u_int16_t *, bus_size_t);
23893c7b57cSdlg void		x86_bus_space_mem_write_region_4(bus_space_handle_t,
23993c7b57cSdlg 		    bus_size_t, const u_int32_t *, bus_size_t);
24093c7b57cSdlg void		x86_bus_space_mem_write_region_8(bus_space_handle_t,
24193c7b57cSdlg 		    bus_size_t, const u_int64_t *, bus_size_t);
24293c7b57cSdlg 
24393c7b57cSdlg void		x86_bus_space_mem_set_multi_1(bus_space_handle_t, bus_size_t,
24493c7b57cSdlg 		    u_int8_t, size_t);
24593c7b57cSdlg void		x86_bus_space_mem_set_multi_2(bus_space_handle_t, bus_size_t,
24693c7b57cSdlg 		    u_int16_t, size_t);
24793c7b57cSdlg void		x86_bus_space_mem_set_multi_4(bus_space_handle_t, bus_size_t,
24893c7b57cSdlg 		    u_int32_t, size_t);
24993c7b57cSdlg void		x86_bus_space_mem_set_multi_8(bus_space_handle_t, bus_size_t,
25093c7b57cSdlg 		    u_int64_t, size_t);
25193c7b57cSdlg 
25293c7b57cSdlg void		x86_bus_space_mem_set_region_1(bus_space_handle_t, bus_size_t,
25393c7b57cSdlg 		    u_int8_t, size_t);
25493c7b57cSdlg void		x86_bus_space_mem_set_region_2(bus_space_handle_t, bus_size_t,
25593c7b57cSdlg 		    u_int16_t, size_t);
25693c7b57cSdlg void		x86_bus_space_mem_set_region_4(bus_space_handle_t, bus_size_t,
25793c7b57cSdlg 		    u_int32_t, size_t);
25893c7b57cSdlg void		x86_bus_space_mem_set_region_8(bus_space_handle_t, bus_size_t,
25993c7b57cSdlg 		    u_int64_t, size_t);
26093c7b57cSdlg 
26193c7b57cSdlg void		x86_bus_space_mem_copy_1(bus_space_handle_t, bus_size_t,
26293c7b57cSdlg 		    bus_space_handle_t, bus_size_t, size_t);
26393c7b57cSdlg void		x86_bus_space_mem_copy_2(bus_space_handle_t, bus_size_t,
26493c7b57cSdlg 		    bus_space_handle_t, bus_size_t, size_t);
26593c7b57cSdlg void		x86_bus_space_mem_copy_4(bus_space_handle_t, bus_size_t,
26693c7b57cSdlg 		    bus_space_handle_t, bus_size_t, size_t);
26793c7b57cSdlg void		x86_bus_space_mem_copy_8(bus_space_handle_t, bus_size_t,
26893c7b57cSdlg 		    bus_space_handle_t, bus_size_t, size_t);
26993c7b57cSdlg 
27093c7b57cSdlg void *		x86_bus_space_mem_vaddr(bus_space_handle_t);
27193c7b57cSdlg 
27293c7b57cSdlg paddr_t		x86_bus_space_mem_mmap(bus_addr_t, off_t, int, int);
27393c7b57cSdlg 
27493c7b57cSdlg const struct x86_bus_space_ops x86_bus_space_mem_ops = {
27593c7b57cSdlg 	x86_bus_space_mem_read_1,
27693c7b57cSdlg 	x86_bus_space_mem_read_2,
27793c7b57cSdlg 	x86_bus_space_mem_read_4,
27893c7b57cSdlg 	x86_bus_space_mem_read_8,
27993c7b57cSdlg 	x86_bus_space_mem_read_multi_1,
28093c7b57cSdlg 	x86_bus_space_mem_read_multi_2,
28193c7b57cSdlg 	x86_bus_space_mem_read_multi_4,
28293c7b57cSdlg 	x86_bus_space_mem_read_multi_8,
28393c7b57cSdlg 	x86_bus_space_mem_read_region_1,
28493c7b57cSdlg 	x86_bus_space_mem_read_region_2,
28593c7b57cSdlg 	x86_bus_space_mem_read_region_4,
28693c7b57cSdlg 	x86_bus_space_mem_read_region_8,
28793c7b57cSdlg 	x86_bus_space_mem_write_1,
28893c7b57cSdlg 	x86_bus_space_mem_write_2,
28993c7b57cSdlg 	x86_bus_space_mem_write_4,
29093c7b57cSdlg 	x86_bus_space_mem_write_8,
29193c7b57cSdlg 	x86_bus_space_mem_write_multi_1,
29293c7b57cSdlg 	x86_bus_space_mem_write_multi_2,
29393c7b57cSdlg 	x86_bus_space_mem_write_multi_4,
29493c7b57cSdlg 	x86_bus_space_mem_write_multi_8,
29593c7b57cSdlg 	x86_bus_space_mem_write_region_1,
29693c7b57cSdlg 	x86_bus_space_mem_write_region_2,
29793c7b57cSdlg 	x86_bus_space_mem_write_region_4,
29893c7b57cSdlg 	x86_bus_space_mem_write_region_8,
29993c7b57cSdlg 	x86_bus_space_mem_set_multi_1,
30093c7b57cSdlg 	x86_bus_space_mem_set_multi_2,
30193c7b57cSdlg 	x86_bus_space_mem_set_multi_4,
30293c7b57cSdlg 	x86_bus_space_mem_set_multi_8,
30393c7b57cSdlg 	x86_bus_space_mem_set_region_1,
30493c7b57cSdlg 	x86_bus_space_mem_set_region_2,
30593c7b57cSdlg 	x86_bus_space_mem_set_region_4,
30693c7b57cSdlg 	x86_bus_space_mem_set_region_8,
30793c7b57cSdlg 	x86_bus_space_mem_copy_1,
30893c7b57cSdlg 	x86_bus_space_mem_copy_2,
30993c7b57cSdlg 	x86_bus_space_mem_copy_4,
31093c7b57cSdlg 	x86_bus_space_mem_copy_8,
31193c7b57cSdlg 	x86_bus_space_mem_vaddr,
31293c7b57cSdlg 	x86_bus_space_mem_mmap
31393c7b57cSdlg };
31493c7b57cSdlg 
315f5df1827Smickey void
x86_bus_space_init(void)3162bb6026aSjsg x86_bus_space_init(void)
317f5df1827Smickey {
318f5df1827Smickey 	/*
319f5df1827Smickey 	 * Initialize the I/O port and I/O mem extent maps.
320f5df1827Smickey 	 * Note: we don't have to check the return value since
321f5df1827Smickey 	 * creation of a fixed extent map will never fail (since
322f5df1827Smickey 	 * descriptor storage has already been allocated).
323f5df1827Smickey 	 *
324f5df1827Smickey 	 * N.B. The iomem extent manages _all_ physical addresses
325f5df1827Smickey 	 * on the machine.  When the amount of RAM is found, the two
326f5df1827Smickey 	 * extents of RAM are allocated from the map (0 -> ISA hole
327f5df1827Smickey 	 * and end of ISA hole -> end of RAM).
328f5df1827Smickey 	 */
329f5df1827Smickey 	ioport_ex = extent_create("ioport", 0x0, 0xffff, M_DEVBUF,
330f5df1827Smickey 	    (caddr_t)ioport_ex_storage, sizeof(ioport_ex_storage),
331f5df1827Smickey 	    EX_NOCOALESCE|EX_NOWAIT);
332ddf0857aSkettenis 	iomem_ex = extent_create("iomem", 0x0, 0xffffffffffff, M_DEVBUF,
333f5df1827Smickey 	    (caddr_t)iomem_ex_storage, sizeof(iomem_ex_storage),
334f5df1827Smickey 	    EX_NOCOALESCE|EX_NOWAIT);
335f5df1827Smickey }
336f5df1827Smickey 
337f5df1827Smickey void
x86_bus_space_mallocok(void)3382bb6026aSjsg x86_bus_space_mallocok(void)
339f5df1827Smickey {
340f5df1827Smickey 	ioport_malloc_safe = 1;
341f5df1827Smickey }
342f5df1827Smickey 
343f5df1827Smickey int
bus_space_map(bus_space_tag_t t,bus_addr_t bpa,bus_size_t size,int flags,bus_space_handle_t * bshp)34499afcea1Sderaadt bus_space_map(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size, int flags,
3452bb6026aSjsg     bus_space_handle_t *bshp)
346f5df1827Smickey {
347f5df1827Smickey 	int error;
348f5df1827Smickey 	struct extent *ex;
349f5df1827Smickey 
350f5df1827Smickey 	/*
351f5df1827Smickey 	 * Pick the appropriate extent map.
352f5df1827Smickey 	 */
353f5df1827Smickey 	if (t == X86_BUS_SPACE_IO) {
354f5df1827Smickey 		ex = ioport_ex;
355515b194eSmarco 		if (flags & BUS_SPACE_MAP_LINEAR)
356515b194eSmarco 			return (EINVAL);
357f5df1827Smickey 	} else if (t == X86_BUS_SPACE_MEM)
358f5df1827Smickey 		ex = iomem_ex;
359f5df1827Smickey 	else
36099afcea1Sderaadt 		panic("bus_space_map: bad bus space tag");
361f5df1827Smickey 
362f5df1827Smickey 	/*
363f5df1827Smickey 	 * Before we go any further, let's make sure that this
364f5df1827Smickey 	 * region is available.
365f5df1827Smickey 	 */
366f5df1827Smickey 	error = extent_alloc_region(ex, bpa, size,
367f5df1827Smickey 	    EX_NOWAIT | (ioport_malloc_safe ? EX_MALLOCOK : 0));
368f5df1827Smickey 	if (error)
369f5df1827Smickey 		return (error);
370f5df1827Smickey 
371f5df1827Smickey 	/*
372f5df1827Smickey 	 * For I/O space, that's all she wrote.
373f5df1827Smickey 	 */
374f5df1827Smickey 	if (t == X86_BUS_SPACE_IO) {
375f5df1827Smickey 		*bshp = bpa;
376f5df1827Smickey 		return (0);
377f5df1827Smickey 	}
378f5df1827Smickey 
379f5df1827Smickey 	if (bpa >= IOM_BEGIN && (bpa + size) <= IOM_END) {
380f5df1827Smickey 		*bshp = (bus_space_handle_t)ISA_HOLE_VADDR(bpa);
381f5df1827Smickey 		return(0);
382f5df1827Smickey 	}
383f5df1827Smickey 
384e12dfaa1Skettenis 	if (!pmap_initialized && bpa < 0x100000000) {
385e12dfaa1Skettenis 		*bshp = (bus_space_handle_t)PMAP_DIRECT_MAP(bpa);
386e12dfaa1Skettenis 		return(0);
387e12dfaa1Skettenis 	}
388e12dfaa1Skettenis 
389f5df1827Smickey 	/*
390f5df1827Smickey 	 * For memory space, map the bus physical address to
391f5df1827Smickey 	 * a kernel virtual address.
392f5df1827Smickey 	 */
3935bac233bSoga 	error = x86_mem_add_mapping(bpa, size, flags, bshp);
394f5df1827Smickey 	if (error) {
395f5df1827Smickey 		if (extent_free(ex, bpa, size, EX_NOWAIT |
396f5df1827Smickey 		    (ioport_malloc_safe ? EX_MALLOCOK : 0))) {
39799afcea1Sderaadt 			printf("bus_space_map: pa 0x%lx, size 0x%lx\n",
398f5df1827Smickey 			    bpa, size);
39999afcea1Sderaadt 			printf("bus_space_map: can't free region\n");
400f5df1827Smickey 		}
401f5df1827Smickey 	}
402f5df1827Smickey 
403f5df1827Smickey 	return (error);
404f5df1827Smickey }
405f5df1827Smickey 
406f5df1827Smickey int
_bus_space_map(bus_space_tag_t t,bus_addr_t bpa,bus_size_t size,int flags,bus_space_handle_t * bshp)40799afcea1Sderaadt _bus_space_map(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size, int flags,
4082bb6026aSjsg     bus_space_handle_t *bshp)
409f5df1827Smickey {
410f5df1827Smickey 
411f5df1827Smickey 	/*
412f5df1827Smickey 	 * For I/O space, just fill in the handle.
413f5df1827Smickey 	 */
414f5df1827Smickey 	if (t == X86_BUS_SPACE_IO) {
415f5df1827Smickey 		*bshp = bpa;
416f5df1827Smickey 		return (0);
417f5df1827Smickey 	}
418f5df1827Smickey 
419f5df1827Smickey 	/*
420f5df1827Smickey 	 * For memory space, map the bus physical address to
421f5df1827Smickey 	 * a kernel virtual address.
422f5df1827Smickey 	 */
4235bac233bSoga 	return (x86_mem_add_mapping(bpa, size, flags, bshp));
424f5df1827Smickey }
425f5df1827Smickey 
426f5df1827Smickey int
bus_space_alloc(bus_space_tag_t t,bus_addr_t rstart,bus_addr_t rend,bus_size_t size,bus_size_t alignment,bus_size_t boundary,int flags,bus_addr_t * bpap,bus_space_handle_t * bshp)42799afcea1Sderaadt bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart, bus_addr_t rend,
4282bb6026aSjsg     bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags,
4292bb6026aSjsg     bus_addr_t *bpap, bus_space_handle_t *bshp)
430f5df1827Smickey {
431f5df1827Smickey 	struct extent *ex;
432f5df1827Smickey 	u_long bpa;
433f5df1827Smickey 	int error;
434f5df1827Smickey 
435f5df1827Smickey 	/*
436f5df1827Smickey 	 * Pick the appropriate extent map.
437f5df1827Smickey 	 */
438f5df1827Smickey 	if (t == X86_BUS_SPACE_IO) {
439f5df1827Smickey 		ex = ioport_ex;
440f5df1827Smickey 	} else if (t == X86_BUS_SPACE_MEM)
441f5df1827Smickey 		ex = iomem_ex;
442f5df1827Smickey 	else
44399afcea1Sderaadt 		panic("bus_space_alloc: bad bus space tag");
444f5df1827Smickey 
445f5df1827Smickey 	/*
446f5df1827Smickey 	 * Sanity check the allocation against the extent's boundaries.
447f5df1827Smickey 	 */
448f5df1827Smickey 	if (rstart < ex->ex_start || rend > ex->ex_end)
44999afcea1Sderaadt 		panic("bus_space_alloc: bad region start/end");
450f5df1827Smickey 
451f5df1827Smickey 	/*
452f5df1827Smickey 	 * Do the requested allocation.
453f5df1827Smickey 	 */
454f5df1827Smickey 	error = extent_alloc_subregion(ex, rstart, rend, size, alignment,
455f5df1827Smickey 	    0, boundary,
456f5df1827Smickey 	    EX_FAST | EX_NOWAIT | (ioport_malloc_safe ?  EX_MALLOCOK : 0),
457f5df1827Smickey 	    &bpa);
458f5df1827Smickey 
459f5df1827Smickey 	if (error)
460f5df1827Smickey 		return (error);
461f5df1827Smickey 
462f5df1827Smickey 	/*
463f5df1827Smickey 	 * For I/O space, that's all she wrote.
464f5df1827Smickey 	 */
465f5df1827Smickey 	if (t == X86_BUS_SPACE_IO) {
466f5df1827Smickey 		*bshp = *bpap = bpa;
467f5df1827Smickey 		return (0);
468f5df1827Smickey 	}
469f5df1827Smickey 
470f5df1827Smickey 	/*
471f5df1827Smickey 	 * For memory space, map the bus physical address to
472f5df1827Smickey 	 * a kernel virtual address.
473f5df1827Smickey 	 */
4745bac233bSoga 	error = x86_mem_add_mapping(bpa, size, flags, bshp);
475f5df1827Smickey 	if (error) {
476f5df1827Smickey 		if (extent_free(iomem_ex, bpa, size, EX_NOWAIT |
477f5df1827Smickey 		    (ioport_malloc_safe ? EX_MALLOCOK : 0))) {
47899afcea1Sderaadt 			printf("bus_space_alloc: pa 0x%lx, size 0x%lx\n",
479f5df1827Smickey 			    bpa, size);
48099afcea1Sderaadt 			printf("bus_space_alloc: can't free region\n");
481f5df1827Smickey 		}
482f5df1827Smickey 	}
483f5df1827Smickey 
484f5df1827Smickey 	*bpap = bpa;
485f5df1827Smickey 
486f5df1827Smickey 	return (error);
487f5df1827Smickey }
488f5df1827Smickey 
489f5df1827Smickey int
x86_mem_add_mapping(bus_addr_t bpa,bus_size_t size,int flags,bus_space_handle_t * bshp)4905bac233bSoga x86_mem_add_mapping(bus_addr_t bpa, bus_size_t size, int flags,
4912bb6026aSjsg     bus_space_handle_t *bshp)
492f5df1827Smickey {
49307dfb2ccSoga 	paddr_t pa, endpa;
494de00544fSoga 	vaddr_t va;
4955bac233bSoga 	bus_size_t map_size;
49607dfb2ccSoga 	int pmap_flags = PMAP_NOCACHE;
4975bac233bSoga 
4985bac233bSoga 	pa = trunc_page(bpa);
4995bac233bSoga 	endpa = round_page(bpa + size);
5005bac233bSoga 
5015bac233bSoga #ifdef DIAGNOSTIC
5025bac233bSoga 	if (endpa <= pa && endpa != 0)
5035bac233bSoga 		panic("bus_mem_add_mapping: overflow");
5045bac233bSoga #endif
5055bac233bSoga 
5065bac233bSoga 	map_size = endpa - pa;
5075bac233bSoga 
50837d9e641Skettenis 	va = (vaddr_t)km_alloc(map_size, &kv_any, &kp_none, &kd_nowait);
5095bac233bSoga 	if (va == 0)
5105bac233bSoga 		return (ENOMEM);
5115bac233bSoga 
5125bac233bSoga 	*bshp = (bus_space_handle_t)(va + (bpa & PGOFSET));
5135bac233bSoga 
51407dfb2ccSoga 	if (flags & BUS_SPACE_MAP_CACHEABLE)
51507dfb2ccSoga 		pmap_flags = 0;
51607dfb2ccSoga 	else if (flags & BUS_SPACE_MAP_PREFETCHABLE)
51707dfb2ccSoga 		pmap_flags = PMAP_WC;
51807dfb2ccSoga 
5195bac233bSoga 	for (; map_size > 0;
520de00544fSoga 	    pa += PAGE_SIZE, va += PAGE_SIZE, map_size -= PAGE_SIZE)
5211e8cdc2eSderaadt 		pmap_kenter_pa(va, pa | pmap_flags, PROT_READ | PROT_WRITE);
5225bac233bSoga 	pmap_update(pmap_kernel());
5235bac233bSoga 
524f5df1827Smickey 	return 0;
525f5df1827Smickey }
526f5df1827Smickey 
527f5df1827Smickey /*
52899afcea1Sderaadt  * void _bus_space_unmap(bus_space_tag bst, bus_space_handle bsh,
529f5df1827Smickey  *                        bus_size_t size, bus_addr_t *adrp)
530f5df1827Smickey  *
531f5df1827Smickey  *   This function unmaps memory- or io-space mapped by the function
53299afcea1Sderaadt  *   _bus_space_map().  This function works nearly as same as
53399afcea1Sderaadt  *   bus_space_unmap(), but this function does not ask kernel
534f5df1827Smickey  *   built-in extents and returns physical address of the bus space,
535f5df1827Smickey  *   for the convenience of the extra extent manager.
536f5df1827Smickey  */
537f5df1827Smickey void
_bus_space_unmap(bus_space_tag_t t,bus_space_handle_t bsh,bus_size_t size,bus_addr_t * adrp)53899afcea1Sderaadt _bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size,
5392bb6026aSjsg     bus_addr_t *adrp)
540f5df1827Smickey {
5415bac233bSoga 	u_long va, endva;
542f5df1827Smickey 	bus_addr_t bpa;
543f5df1827Smickey 
544f5df1827Smickey 	/*
5455bac233bSoga 	 * Find the correct bus physical address.
546f5df1827Smickey 	 */
547f5df1827Smickey 	if (t == X86_BUS_SPACE_IO) {
548f5df1827Smickey 		bpa = bsh;
549f5df1827Smickey 	} else if (t == X86_BUS_SPACE_MEM) {
550f5df1827Smickey 		bpa = (bus_addr_t)ISA_PHYSADDR(bsh);
5515bac233bSoga 		if (IOM_BEGIN <= bpa && bpa <= IOM_END)
5525bac233bSoga 			goto ok;
553f5df1827Smickey 
5545bac233bSoga 		va = trunc_page(bsh);
5555bac233bSoga 		endva = round_page(bsh + size);
5565bac233bSoga 
5575bac233bSoga #ifdef DIAGNOSTIC
5585bac233bSoga 		if (endva <= va)
5595bac233bSoga 			panic("_bus_space_unmap: overflow");
5605bac233bSoga #endif
5615bac233bSoga 
5625bac233bSoga 		(void) pmap_extract(pmap_kernel(), va, &bpa);
5635bac233bSoga 		bpa += (bsh & PGOFSET);
5645bac233bSoga 
5655bac233bSoga 		pmap_kremove(va, endva - va);
5665bac233bSoga 		pmap_update(pmap_kernel());
5675bac233bSoga 
5685bac233bSoga 		/*
5695bac233bSoga 		 * Free the kernel virtual mapping.
5705bac233bSoga 		 */
57137d9e641Skettenis 		km_free((void *)va, endva - va, &kv_any, &kp_none);
5725bac233bSoga 	} else
5735bac233bSoga 		panic("bus_space_unmap: bad bus space tag");
5745bac233bSoga 
5755bac233bSoga ok:
5765bac233bSoga 	if (adrp != NULL)
577f5df1827Smickey 		*adrp = bpa;
578f5df1827Smickey }
579f5df1827Smickey 
580f5df1827Smickey void
bus_space_unmap(bus_space_tag_t t,bus_space_handle_t bsh,bus_size_t size)58199afcea1Sderaadt bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size)
582f5df1827Smickey {
583f5df1827Smickey 	struct extent *ex;
5845bac233bSoga 	u_long va, endva;
585f5df1827Smickey 	bus_addr_t bpa;
586f5df1827Smickey 
587f5df1827Smickey 	/*
588f5df1827Smickey 	 * Find the correct extent and bus physical address.
589f5df1827Smickey 	 */
590f5df1827Smickey 	if (t == X86_BUS_SPACE_IO) {
591f5df1827Smickey 		ex = ioport_ex;
592f5df1827Smickey 		bpa = bsh;
593f5df1827Smickey 	} else if (t == X86_BUS_SPACE_MEM) {
594f5df1827Smickey 		ex = iomem_ex;
595f5df1827Smickey 		bpa = (bus_addr_t)ISA_PHYSADDR(bsh);
5965bac233bSoga 		if (IOM_BEGIN <= bpa && bpa <= IOM_END)
597f5df1827Smickey 			goto ok;
598f5df1827Smickey 
599e12dfaa1Skettenis 		if (bsh >= PMAP_DIRECT_BASE && bsh < PMAP_DIRECT_END) {
600e12dfaa1Skettenis 			bpa = PMAP_DIRECT_UNMAP(bsh);
601e12dfaa1Skettenis 			goto ok;
602e12dfaa1Skettenis 		}
603e12dfaa1Skettenis 
6045bac233bSoga 		va = trunc_page(bsh);
6055bac233bSoga 		endva = round_page(bsh + size);
6065bac233bSoga 
6075bac233bSoga #ifdef DIAGNOSTIC
6085bac233bSoga 		if (endva <= va)
6095bac233bSoga 			panic("bus_space_unmap: overflow");
6105bac233bSoga #endif
6115bac233bSoga 
6125bac233bSoga 		(void)pmap_extract(pmap_kernel(), va, &bpa);
6135bac233bSoga 		bpa += (bsh & PGOFSET);
6145bac233bSoga 
6155bac233bSoga 		pmap_kremove(va, endva - va);
6165bac233bSoga 		pmap_update(pmap_kernel());
6175bac233bSoga 
6185bac233bSoga 		/*
6195bac233bSoga 		 * Free the kernel virtual mapping.
6205bac233bSoga 		 */
62137d9e641Skettenis 		km_free((void *)va, endva - va, &kv_any, &kp_none);
622f5df1827Smickey 	} else
62399afcea1Sderaadt 		panic("bus_space_unmap: bad bus space tag");
624f5df1827Smickey 
625f5df1827Smickey ok:
626f5df1827Smickey 	if (extent_free(ex, bpa, size,
627f5df1827Smickey 	    EX_NOWAIT | (ioport_malloc_safe ? EX_MALLOCOK : 0))) {
62899afcea1Sderaadt 		printf("bus_space_unmap: %s 0x%lx, size 0x%lx\n",
629f5df1827Smickey 		    (t == X86_BUS_SPACE_IO) ? "port" : "pa", bpa, size);
63099afcea1Sderaadt 		printf("bus_space_unmap: can't free region\n");
631f5df1827Smickey 	}
632f5df1827Smickey }
633f5df1827Smickey 
634f5df1827Smickey void
bus_space_free(bus_space_tag_t t,bus_space_handle_t bsh,bus_size_t size)63599afcea1Sderaadt bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size)
636f5df1827Smickey {
637f5df1827Smickey 
63899afcea1Sderaadt 	/* bus_space_unmap() does all that we need to do. */
63999afcea1Sderaadt 	bus_space_unmap(t, bsh, size);
640f5df1827Smickey }
641f5df1827Smickey 
642f5df1827Smickey int
bus_space_subregion(bus_space_tag_t t,bus_space_handle_t bsh,bus_size_t offset,bus_size_t size,bus_space_handle_t * nbshp)64399afcea1Sderaadt bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
6442bb6026aSjsg     bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp)
645f5df1827Smickey {
646f5df1827Smickey 
647f5df1827Smickey 	*nbshp = bsh + offset;
648f5df1827Smickey 	return (0);
649f5df1827Smickey }
650f5df1827Smickey 
651ebbaad44Soga u_int8_t
x86_bus_space_io_read_1(bus_space_handle_t h,bus_size_t o)65293c7b57cSdlg x86_bus_space_io_read_1(bus_space_handle_t h, bus_size_t o)
653ebbaad44Soga {
65493c7b57cSdlg 	return (inb(h + o));
655ebbaad44Soga }
656ebbaad44Soga 
657ebbaad44Soga u_int16_t
x86_bus_space_io_read_2(bus_space_handle_t h,bus_size_t o)65893c7b57cSdlg x86_bus_space_io_read_2(bus_space_handle_t h, bus_size_t o)
659ebbaad44Soga {
66093c7b57cSdlg 	return (inw(h + o));
661ebbaad44Soga }
662ebbaad44Soga 
663ebbaad44Soga u_int32_t
x86_bus_space_io_read_4(bus_space_handle_t h,bus_size_t o)66493c7b57cSdlg x86_bus_space_io_read_4(bus_space_handle_t h, bus_size_t o)
665ebbaad44Soga {
66693c7b57cSdlg 	return (inl(h + o));
667ebbaad44Soga }
668ebbaad44Soga 
6699f2791f2Sdlg u_int64_t
x86_bus_space_io_read_8(bus_space_handle_t h,bus_size_t o)67093c7b57cSdlg x86_bus_space_io_read_8(bus_space_handle_t h, bus_size_t o)
6719f2791f2Sdlg {
67293c7b57cSdlg 	panic("bus_space_read_8: invalid bus space tag");
6739f2791f2Sdlg }
6749f2791f2Sdlg 
675ebbaad44Soga void
x86_bus_space_io_read_multi_1(bus_space_handle_t h,bus_size_t o,u_int8_t * ptr,bus_size_t cnt)67693c7b57cSdlg x86_bus_space_io_read_multi_1(bus_space_handle_t h, bus_size_t o,
677ebbaad44Soga     u_int8_t *ptr, bus_size_t cnt)
678ebbaad44Soga {
679ebbaad44Soga 	insb(h + o, ptr, cnt);
680ebbaad44Soga }
681ebbaad44Soga 
682ebbaad44Soga void
x86_bus_space_io_read_multi_2(bus_space_handle_t h,bus_size_t o,u_int16_t * ptr,bus_size_t cnt)68393c7b57cSdlg x86_bus_space_io_read_multi_2(bus_space_handle_t h, bus_size_t o,
684ebbaad44Soga     u_int16_t *ptr, bus_size_t cnt)
685ebbaad44Soga {
686ebbaad44Soga 	insw(h + o, ptr, cnt);
687ebbaad44Soga }
688ebbaad44Soga 
689ebbaad44Soga void
x86_bus_space_io_read_multi_4(bus_space_handle_t h,bus_size_t o,u_int32_t * ptr,bus_size_t cnt)69093c7b57cSdlg x86_bus_space_io_read_multi_4(bus_space_handle_t h, bus_size_t o,
691ebbaad44Soga     u_int32_t *ptr, bus_size_t cnt)
692ebbaad44Soga {
693ebbaad44Soga 	insl(h + o, ptr, cnt);
694ebbaad44Soga }
695ebbaad44Soga 
696ebbaad44Soga void
x86_bus_space_io_read_multi_8(bus_space_handle_t h,bus_size_t o,u_int64_t * ptr,bus_size_t cnt)69793c7b57cSdlg x86_bus_space_io_read_multi_8(bus_space_handle_t h, bus_size_t o,
6989f2791f2Sdlg     u_int64_t *ptr, bus_size_t cnt)
6999f2791f2Sdlg {
70093c7b57cSdlg 	panic("bus_space_multi_8: invalid bus space tag");
7019f2791f2Sdlg }
7029f2791f2Sdlg 
7039f2791f2Sdlg void
x86_bus_space_io_read_region_1(bus_space_handle_t h,bus_size_t o,u_int8_t * ptr,bus_size_t cnt)70493c7b57cSdlg x86_bus_space_io_read_region_1(bus_space_handle_t h,
705ebbaad44Soga     bus_size_t o, u_int8_t *ptr, bus_size_t cnt)
706ebbaad44Soga {
707ebbaad44Soga 	int dummy1;
708ebbaad44Soga 	void *dummy2;
709ebbaad44Soga 	int dummy3;
710ebbaad44Soga 	int __x;
711d5e88557Sjsg 	u_int32_t port = h + o;
712e39f036fSguenther 	__asm volatile(
713ebbaad44Soga 	"1:	inb %w1,%%al				;"
714ebbaad44Soga 	"	stosb					;"
715ebbaad44Soga 	"	incl %1					;"
716ebbaad44Soga 	"	loop 1b"				:
717ebbaad44Soga 	    "=&a" (__x), "=d" (dummy1), "=D" (dummy2),
718ebbaad44Soga 	    "=c" (dummy3)				:
719d5e88557Sjsg 	    "1" (port), "2" (ptr), "3" (cnt)	:
720ebbaad44Soga 	    "memory");
721ebbaad44Soga }
722ebbaad44Soga 
723ebbaad44Soga void
x86_bus_space_io_read_region_2(bus_space_handle_t h,bus_size_t o,u_int16_t * ptr,bus_size_t cnt)72493c7b57cSdlg x86_bus_space_io_read_region_2(bus_space_handle_t h,
725ebbaad44Soga     bus_size_t o, u_int16_t *ptr, bus_size_t cnt)
726ebbaad44Soga {
727ebbaad44Soga 	int dummy1;
728ebbaad44Soga 	void *dummy2;
729ebbaad44Soga 	int dummy3;
730ebbaad44Soga 	int __x;
731d5e88557Sjsg 	u_int32_t port = h + o;
732e39f036fSguenther 	__asm volatile(
733ebbaad44Soga 	"1:	inw %w1,%%ax				;"
734ebbaad44Soga 	"	stosw					;"
735ebbaad44Soga 	"	addl $2,%1				;"
736ebbaad44Soga 	"	loop 1b"				:
737ebbaad44Soga 	    "=&a" (__x), "=d" (dummy1), "=D" (dummy2),
738ebbaad44Soga 	    "=c" (dummy3)				:
739d5e88557Sjsg 	    "1" ((port)), "2" ((ptr)), "3" ((cnt))	:
740ebbaad44Soga 	    "memory");
741ebbaad44Soga }
742ebbaad44Soga 
743ebbaad44Soga void
x86_bus_space_io_read_region_4(bus_space_handle_t h,bus_size_t o,u_int32_t * ptr,bus_size_t cnt)74493c7b57cSdlg x86_bus_space_io_read_region_4(bus_space_handle_t h,
745ebbaad44Soga     bus_size_t o, u_int32_t *ptr, bus_size_t cnt)
746ebbaad44Soga {
747ebbaad44Soga 	int dummy1;
748ebbaad44Soga 	void *dummy2;
749ebbaad44Soga 	int dummy3;
750ebbaad44Soga 	int __x;
751d5e88557Sjsg 	u_int32_t port = h + o;
752e39f036fSguenther 	__asm volatile(
753ebbaad44Soga 	"1:	inl %w1,%%eax				;"
754ebbaad44Soga 	"	stosl					;"
755ebbaad44Soga 	"	addl $4,%1				;"
756ebbaad44Soga 	"	loop 1b"				:
757ebbaad44Soga 	    "=&a" (__x), "=d" (dummy1), "=D" (dummy2),
758ebbaad44Soga 	    "=c" (dummy3)				:
759d5e88557Sjsg 	    "1" (port), "2" (ptr), "3" (cnt)	:
760ebbaad44Soga 	    "memory");
761ebbaad44Soga }
7629f2791f2Sdlg 
7639f2791f2Sdlg void
x86_bus_space_io_read_region_8(bus_space_handle_t h,bus_size_t o,u_int64_t * ptr,bus_size_t cnt)76493c7b57cSdlg x86_bus_space_io_read_region_8(bus_space_handle_t h,
7659f2791f2Sdlg     bus_size_t o, u_int64_t *ptr, bus_size_t cnt)
7669f2791f2Sdlg {
76793c7b57cSdlg 	panic("bus_space_read_region_8: invalid bus space tag");
7689f2791f2Sdlg }
7699f2791f2Sdlg 
770ebbaad44Soga void
x86_bus_space_io_write_1(bus_space_handle_t h,bus_size_t o,u_int8_t v)77193c7b57cSdlg x86_bus_space_io_write_1(bus_space_handle_t h, bus_size_t o, u_int8_t v)
772ebbaad44Soga {
773ebbaad44Soga 	outb(h + o, v);
774ebbaad44Soga }
775ebbaad44Soga 
776ebbaad44Soga void
x86_bus_space_io_write_2(bus_space_handle_t h,bus_size_t o,u_int16_t v)77793c7b57cSdlg x86_bus_space_io_write_2(bus_space_handle_t h, bus_size_t o, u_int16_t v)
778ebbaad44Soga {
779ebbaad44Soga 	outw(h + o, v);
780ebbaad44Soga }
781ebbaad44Soga 
782ebbaad44Soga void
x86_bus_space_io_write_4(bus_space_handle_t h,bus_size_t o,u_int32_t v)78393c7b57cSdlg x86_bus_space_io_write_4(bus_space_handle_t h, bus_size_t o, u_int32_t v)
784ebbaad44Soga {
785ebbaad44Soga 	outl(h + o, v);
786ebbaad44Soga }
787ebbaad44Soga 
788ebbaad44Soga void
x86_bus_space_io_write_8(bus_space_handle_t h,bus_size_t o,u_int64_t v)78993c7b57cSdlg x86_bus_space_io_write_8(bus_space_handle_t h, bus_size_t o, u_int64_t v)
7909f2791f2Sdlg {
79193c7b57cSdlg 	panic("bus_space_write_8: invalid bus space tag");
7929f2791f2Sdlg }
7939f2791f2Sdlg 
7949f2791f2Sdlg void
x86_bus_space_io_write_multi_1(bus_space_handle_t h,bus_size_t o,const u_int8_t * ptr,bus_size_t cnt)79593c7b57cSdlg x86_bus_space_io_write_multi_1(bus_space_handle_t h,
796ebbaad44Soga     bus_size_t o, const u_int8_t *ptr, bus_size_t cnt)
797ebbaad44Soga {
798ebbaad44Soga 	outsb(h + o, ptr, cnt);
799ebbaad44Soga }
800ebbaad44Soga 
801ebbaad44Soga void
x86_bus_space_io_write_multi_2(bus_space_handle_t h,bus_size_t o,const u_int16_t * ptr,bus_size_t cnt)80293c7b57cSdlg x86_bus_space_io_write_multi_2(bus_space_handle_t h,
803ebbaad44Soga     bus_size_t o, const u_int16_t *ptr, bus_size_t cnt)
804ebbaad44Soga {
805ebbaad44Soga 	outsw(h + o, ptr, cnt);
806ebbaad44Soga }
807ebbaad44Soga 
808ebbaad44Soga void
x86_bus_space_io_write_multi_4(bus_space_handle_t h,bus_size_t o,const u_int32_t * ptr,bus_size_t cnt)80993c7b57cSdlg x86_bus_space_io_write_multi_4(bus_space_handle_t h,
810ebbaad44Soga     bus_size_t o, const u_int32_t *ptr, bus_size_t cnt)
811ebbaad44Soga {
812ebbaad44Soga 	outsl(h + o, ptr, cnt);
813ebbaad44Soga }
814ebbaad44Soga 
815ebbaad44Soga void
x86_bus_space_io_write_multi_8(bus_space_handle_t h,bus_size_t o,const u_int64_t * ptr,bus_size_t cnt)81693c7b57cSdlg x86_bus_space_io_write_multi_8(bus_space_handle_t h,
8179f2791f2Sdlg     bus_size_t o, const u_int64_t *ptr, bus_size_t cnt)
8189f2791f2Sdlg {
81993c7b57cSdlg 	panic("bus_space_write_multi_8: invalid bus space tag");
8209f2791f2Sdlg }
8219f2791f2Sdlg 
8229f2791f2Sdlg void
x86_bus_space_io_write_region_1(bus_space_handle_t h,bus_size_t o,const u_int8_t * ptr,bus_size_t cnt)82393c7b57cSdlg x86_bus_space_io_write_region_1(bus_space_handle_t h,
824ebbaad44Soga     bus_size_t o, const u_int8_t *ptr, bus_size_t cnt)
825ebbaad44Soga {
826ebbaad44Soga 	int dummy1;
827ebbaad44Soga 	void *dummy2;
828ebbaad44Soga 	int dummy3;
829ebbaad44Soga 	int __x;
830d5e88557Sjsg 	u_int32_t port = h + o;
831e39f036fSguenther 	__asm volatile(
832ebbaad44Soga 	"1:	lodsb					;"
833ebbaad44Soga 	"	outb %%al,%w1				;"
834ebbaad44Soga 	"	incl %1					;"
835ebbaad44Soga 	"	loop 1b"				:
836ebbaad44Soga 	    "=&a" (__x), "=d" (dummy1), "=S" (dummy2),
837ebbaad44Soga 	    "=c" (dummy3)				:
838d5e88557Sjsg 	    "1" (port), "2" (ptr), "3" (cnt)	:
839ebbaad44Soga 	    "memory");
840ebbaad44Soga }
841ebbaad44Soga 
842ebbaad44Soga void
x86_bus_space_io_write_region_2(bus_space_handle_t h,bus_size_t o,const u_int16_t * ptr,bus_size_t cnt)84393c7b57cSdlg x86_bus_space_io_write_region_2(bus_space_handle_t h,
844ebbaad44Soga     bus_size_t o, const u_int16_t *ptr, bus_size_t cnt)
845ebbaad44Soga {
846ebbaad44Soga 	int dummy1;
847ebbaad44Soga 	void *dummy2;
848ebbaad44Soga 	int dummy3;
849ebbaad44Soga 	int __x;
850d5e88557Sjsg 	u_int32_t port = h + o;
851e39f036fSguenther 	__asm volatile(
852ebbaad44Soga 	"1:	lodsw					;"
853ebbaad44Soga 	"	outw %%ax,%w1				;"
854ebbaad44Soga 	"	addl $2,%1				;"
855ebbaad44Soga 	"	loop 1b"				:
856ebbaad44Soga 	    "=&a" (__x), "=d" (dummy1), "=S" (dummy2),
857ebbaad44Soga 	    "=c" (dummy3)				:
858d5e88557Sjsg 	    "1" (port), "2" (ptr), "3" (cnt)	:
859ebbaad44Soga 	    "memory");
860ebbaad44Soga }
861ebbaad44Soga 
862ebbaad44Soga void
x86_bus_space_io_write_region_4(bus_space_handle_t h,bus_size_t o,const u_int32_t * ptr,bus_size_t cnt)86393c7b57cSdlg x86_bus_space_io_write_region_4(bus_space_handle_t h,
864ebbaad44Soga     bus_size_t o, const u_int32_t *ptr, bus_size_t cnt)
865ebbaad44Soga {
866ebbaad44Soga 	int dummy1;
867ebbaad44Soga 	void *dummy2;
868ebbaad44Soga 	int dummy3;
869ebbaad44Soga 	int __x;
870d5e88557Sjsg 	u_int32_t port = h + o;
871e39f036fSguenther 	__asm volatile(
872ebbaad44Soga 	"1:	lodsl					;"
873ebbaad44Soga 	"	outl %%eax,%w1				;"
874ebbaad44Soga 	"	addl $4,%1				;"
875ebbaad44Soga 	"	loop 1b"				:
876ebbaad44Soga 	    "=&a" (__x), "=d" (dummy1), "=S" (dummy2),
877ebbaad44Soga 	    "=c" (dummy3)				:
878d5e88557Sjsg 	    "1" (port), "2" (ptr), "3" (cnt)	:
879ebbaad44Soga 	    "memory");
88093c7b57cSdlg }
88193c7b57cSdlg 
88293c7b57cSdlg void
x86_bus_space_io_write_region_8(bus_space_handle_t h,bus_size_t o,const u_int64_t * ptr,bus_size_t cnt)88393c7b57cSdlg x86_bus_space_io_write_region_8(bus_space_handle_t h,
88493c7b57cSdlg     bus_size_t o, const u_int64_t *ptr, bus_size_t cnt)
88593c7b57cSdlg {
88693c7b57cSdlg 	panic("bus_space_write_region_8: invalid bus space tag");
88793c7b57cSdlg }
88893c7b57cSdlg 
88993c7b57cSdlg void
x86_bus_space_io_set_multi_1(bus_space_handle_t h,bus_size_t o,u_int8_t v,size_t c)89093c7b57cSdlg x86_bus_space_io_set_multi_1(bus_space_handle_t h, bus_size_t o,
89193c7b57cSdlg     u_int8_t v, size_t c)
89293c7b57cSdlg {
89393c7b57cSdlg 	bus_addr_t addr = h + o;
89493c7b57cSdlg 
89593c7b57cSdlg 	while (c--)
89693c7b57cSdlg 		outb(addr, v);
89793c7b57cSdlg }
89893c7b57cSdlg 
89993c7b57cSdlg void
x86_bus_space_io_set_multi_2(bus_space_handle_t h,bus_size_t o,u_int16_t v,size_t c)90093c7b57cSdlg x86_bus_space_io_set_multi_2(bus_space_handle_t h, bus_size_t o,
90193c7b57cSdlg     u_int16_t v, size_t c)
90293c7b57cSdlg {
90393c7b57cSdlg 	bus_addr_t addr = h + o;
90493c7b57cSdlg 
90593c7b57cSdlg 	while (c--)
90693c7b57cSdlg 		outw(addr, v);
90793c7b57cSdlg }
90893c7b57cSdlg 
90993c7b57cSdlg void
x86_bus_space_io_set_multi_4(bus_space_handle_t h,bus_size_t o,u_int32_t v,size_t c)91093c7b57cSdlg x86_bus_space_io_set_multi_4(bus_space_handle_t h, bus_size_t o,
91193c7b57cSdlg     u_int32_t v, size_t c)
91293c7b57cSdlg {
91393c7b57cSdlg 	bus_addr_t addr = h + o;
91493c7b57cSdlg 
91593c7b57cSdlg 	while (c--)
91693c7b57cSdlg 		outl(addr, v);
91793c7b57cSdlg }
91893c7b57cSdlg 
91993c7b57cSdlg void
x86_bus_space_io_set_multi_8(bus_space_handle_t h,bus_size_t o,u_int64_t v,size_t c)92093c7b57cSdlg x86_bus_space_io_set_multi_8(bus_space_handle_t h, bus_size_t o,
92193c7b57cSdlg     u_int64_t v, size_t c)
92293c7b57cSdlg {
92393c7b57cSdlg 	panic("bus_space_set_multi_8: invalid bus space tag");
92493c7b57cSdlg }
92593c7b57cSdlg 
92693c7b57cSdlg void
x86_bus_space_io_set_region_1(bus_space_handle_t h,bus_size_t o,u_int8_t v,size_t c)92793c7b57cSdlg x86_bus_space_io_set_region_1(bus_space_handle_t h, bus_size_t o,
92893c7b57cSdlg     u_int8_t v, size_t c)
92993c7b57cSdlg {
93093c7b57cSdlg 	bus_addr_t addr = h + o;
93193c7b57cSdlg 
93293c7b57cSdlg 	for (; c != 0; c--, addr++)
93393c7b57cSdlg 		outb(addr, v);
93493c7b57cSdlg }
93593c7b57cSdlg 
93693c7b57cSdlg void
x86_bus_space_io_set_region_2(bus_space_handle_t h,bus_size_t o,u_int16_t v,size_t c)93793c7b57cSdlg x86_bus_space_io_set_region_2(bus_space_handle_t h, bus_size_t o,
93893c7b57cSdlg     u_int16_t v, size_t c)
93993c7b57cSdlg {
94093c7b57cSdlg 	bus_addr_t addr = h + o;
94193c7b57cSdlg 
94293c7b57cSdlg 	for (; c != 0; c--, addr += sizeof(v))
94393c7b57cSdlg 		outw(addr, v);
94493c7b57cSdlg }
94593c7b57cSdlg 
94693c7b57cSdlg void
x86_bus_space_io_set_region_4(bus_space_handle_t h,bus_size_t o,u_int32_t v,size_t c)94793c7b57cSdlg x86_bus_space_io_set_region_4(bus_space_handle_t h, bus_size_t o,
94893c7b57cSdlg     u_int32_t v, size_t c)
94993c7b57cSdlg {
95093c7b57cSdlg 	bus_addr_t addr = h + o;
95193c7b57cSdlg 
95293c7b57cSdlg 	for (; c != 0; c--, addr += sizeof(v))
95393c7b57cSdlg 		outl(addr, v);
95493c7b57cSdlg }
95593c7b57cSdlg 
95693c7b57cSdlg void
x86_bus_space_io_set_region_8(bus_space_handle_t h,bus_size_t o,u_int64_t v,size_t c)95793c7b57cSdlg x86_bus_space_io_set_region_8(bus_space_handle_t h, bus_size_t o,
95893c7b57cSdlg     u_int64_t v, size_t c)
95993c7b57cSdlg {
96093c7b57cSdlg 	panic("bus_space_set_region_8: invalid bus space tag");
96193c7b57cSdlg }
96293c7b57cSdlg 
96393c7b57cSdlg void
x86_bus_space_io_copy_1(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,size_t c)96493c7b57cSdlg x86_bus_space_io_copy_1(bus_space_handle_t h1, bus_size_t o1,
96593c7b57cSdlg     bus_space_handle_t h2, bus_size_t o2, size_t c)
96693c7b57cSdlg {
96793c7b57cSdlg 	bus_addr_t addr1 = h1 + o1;
96893c7b57cSdlg 	bus_addr_t addr2 = h2 + o2;
96993c7b57cSdlg 
97093c7b57cSdlg 	if (addr1 >= addr2) {
97193c7b57cSdlg 		/* src after dest: copy forward */
97293c7b57cSdlg 		for (; c != 0; c--, addr1++, addr2++)
97393c7b57cSdlg 			outb(addr2, inb(addr1));
974ebbaad44Soga 	} else {
97593c7b57cSdlg 		/* dest after src: copy backwards */
97693c7b57cSdlg 		for (addr1 += (c - 1), addr2 += (c - 1);
97793c7b57cSdlg 		    c != 0; c--, addr1--, addr2--)
97893c7b57cSdlg 			outb(addr2, inb(addr1));
97993c7b57cSdlg 	}
98093c7b57cSdlg }
98193c7b57cSdlg 
98293c7b57cSdlg void
x86_bus_space_io_copy_2(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,size_t c)98393c7b57cSdlg x86_bus_space_io_copy_2(bus_space_handle_t h1, bus_size_t o1,
98493c7b57cSdlg     bus_space_handle_t h2, bus_size_t o2, size_t c)
98593c7b57cSdlg {
98693c7b57cSdlg 	bus_addr_t addr1 = h1 + o1;
98793c7b57cSdlg 	bus_addr_t addr2 = h2 + o2;
98893c7b57cSdlg 
98993c7b57cSdlg 	if (addr1 >= addr2) {
99093c7b57cSdlg 		/* src after dest: copy forward */
99193c7b57cSdlg 		for (; c != 0; c--, addr1 += 2, addr2 += 2)
99293c7b57cSdlg 			outw(addr2, inw(addr1));
99393c7b57cSdlg 	} else {
99493c7b57cSdlg 		/* dest after src: copy backwards */
99593c7b57cSdlg 		for (addr1 += 2 * (c - 1), addr2 += 2 * (c - 1);
99693c7b57cSdlg 		    c != 0; c--, addr1 -= 2, addr2 -= 2)
99793c7b57cSdlg 			outw(addr2, inw(addr1));
99893c7b57cSdlg 	}
99993c7b57cSdlg }
100093c7b57cSdlg 
100193c7b57cSdlg void
x86_bus_space_io_copy_4(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,size_t c)100293c7b57cSdlg x86_bus_space_io_copy_4(bus_space_handle_t h1, bus_size_t o1,
100393c7b57cSdlg     bus_space_handle_t h2, bus_size_t o2, size_t c)
100493c7b57cSdlg {
100593c7b57cSdlg 	bus_addr_t addr1 = h1 + o1;
100693c7b57cSdlg 	bus_addr_t addr2 = h2 + o2;
100793c7b57cSdlg 
100893c7b57cSdlg 	if (addr1 >= addr2) {
100993c7b57cSdlg 		/* src after dest: copy forward */
101093c7b57cSdlg 		for (; c != 0; c--, addr1 += 4, addr2 += 4)
101193c7b57cSdlg 			outl(addr2, inl(addr1));
101293c7b57cSdlg 	} else {
101393c7b57cSdlg 		/* dest after src: copy backwards */
101493c7b57cSdlg 		for (addr1 += 4 * (c - 1), addr2 += 4 * (c - 1);
101593c7b57cSdlg 		    c != 0; c--, addr1 -= 4, addr2 -= 4)
101693c7b57cSdlg 			outl(addr2, inl(addr1));
101793c7b57cSdlg 	}
101893c7b57cSdlg }
101993c7b57cSdlg 
102093c7b57cSdlg void
x86_bus_space_io_copy_8(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,size_t c)102193c7b57cSdlg x86_bus_space_io_copy_8(bus_space_handle_t h1, bus_size_t o1,
102293c7b57cSdlg     bus_space_handle_t h2, bus_size_t o2, size_t c)
102393c7b57cSdlg {
102493c7b57cSdlg 	panic("bus_space_set_region_8: invalid bus space tag");
102593c7b57cSdlg }
102693c7b57cSdlg 
102793c7b57cSdlg void *
x86_bus_space_io_vaddr(bus_space_handle_t h)102893c7b57cSdlg x86_bus_space_io_vaddr(bus_space_handle_t h)
102993c7b57cSdlg {
103093c7b57cSdlg 	return (NULL);
103193c7b57cSdlg }
103293c7b57cSdlg 
103393c7b57cSdlg paddr_t
x86_bus_space_io_mmap(bus_addr_t addr,off_t off,int prot,int flags)103493c7b57cSdlg x86_bus_space_io_mmap(bus_addr_t addr, off_t off, int prot, int flags)
103593c7b57cSdlg {
103693c7b57cSdlg 	/* Can't mmap I/O space. */
103793c7b57cSdlg 	return (-1);
103893c7b57cSdlg }
103993c7b57cSdlg 
104093c7b57cSdlg void
x86_bus_space_mem_write_1(bus_space_handle_t h,bus_size_t o,u_int8_t v)104193c7b57cSdlg x86_bus_space_mem_write_1(bus_space_handle_t h, bus_size_t o, u_int8_t v)
104293c7b57cSdlg {
104393c7b57cSdlg 	*(volatile u_int8_t *)(h + o) = v;
104493c7b57cSdlg }
104593c7b57cSdlg 
104693c7b57cSdlg void
x86_bus_space_mem_write_2(bus_space_handle_t h,bus_size_t o,u_int16_t v)104793c7b57cSdlg x86_bus_space_mem_write_2(bus_space_handle_t h, bus_size_t o, u_int16_t v)
104893c7b57cSdlg {
104993c7b57cSdlg 	*(volatile u_int16_t *)(h + o) = v;
105093c7b57cSdlg }
105193c7b57cSdlg 
105293c7b57cSdlg u_int8_t
x86_bus_space_mem_read_1(bus_space_handle_t h,bus_size_t o)105393c7b57cSdlg x86_bus_space_mem_read_1(bus_space_handle_t h, bus_size_t o)
105493c7b57cSdlg {
105593c7b57cSdlg 	return (*(volatile u_int8_t *)(h + o));
105693c7b57cSdlg }
105793c7b57cSdlg 
105893c7b57cSdlg u_int16_t
x86_bus_space_mem_read_2(bus_space_handle_t h,bus_size_t o)105993c7b57cSdlg x86_bus_space_mem_read_2(bus_space_handle_t h, bus_size_t o)
106093c7b57cSdlg {
106193c7b57cSdlg 	return (*(volatile u_int16_t *)(h + o));
106293c7b57cSdlg }
106393c7b57cSdlg 
106493c7b57cSdlg u_int32_t
x86_bus_space_mem_read_4(bus_space_handle_t h,bus_size_t o)106593c7b57cSdlg x86_bus_space_mem_read_4(bus_space_handle_t h, bus_size_t o)
106693c7b57cSdlg {
106793c7b57cSdlg 	return (*(volatile u_int32_t *)(h + o));
106893c7b57cSdlg }
106993c7b57cSdlg 
107093c7b57cSdlg u_int64_t
x86_bus_space_mem_read_8(bus_space_handle_t h,bus_size_t o)107193c7b57cSdlg x86_bus_space_mem_read_8(bus_space_handle_t h, bus_size_t o)
107293c7b57cSdlg {
107393c7b57cSdlg 	return (*(volatile u_int64_t *)(h + o));
107493c7b57cSdlg }
107593c7b57cSdlg 
107693c7b57cSdlg void
x86_bus_space_mem_read_multi_1(bus_space_handle_t h,bus_size_t o,u_int8_t * ptr,bus_size_t cnt)107793c7b57cSdlg x86_bus_space_mem_read_multi_1(bus_space_handle_t h, bus_size_t o,
107893c7b57cSdlg     u_int8_t *ptr, bus_size_t cnt)
107993c7b57cSdlg {
108093c7b57cSdlg 	void *dummy1;
108193c7b57cSdlg 	int dummy2;
108293c7b57cSdlg 	void *dummy3;
108393c7b57cSdlg 	int __x;
1084e39f036fSguenther 	__asm volatile(
108593c7b57cSdlg 	"1:	movb (%2),%%al				;"
108693c7b57cSdlg 	"	stosb					;"
108793c7b57cSdlg 	"	loop 1b"				:
108893c7b57cSdlg 	    "=D" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) :
108993c7b57cSdlg 	    "0" ((ptr)), "1" ((cnt)), "2" (h + o)       :
109093c7b57cSdlg 	    "memory");
109193c7b57cSdlg }
109293c7b57cSdlg 
109393c7b57cSdlg void
x86_bus_space_mem_read_multi_2(bus_space_handle_t h,bus_size_t o,u_int16_t * ptr,bus_size_t cnt)109493c7b57cSdlg x86_bus_space_mem_read_multi_2(bus_space_handle_t h, bus_size_t o,
109593c7b57cSdlg     u_int16_t *ptr, bus_size_t cnt)
109693c7b57cSdlg {
109793c7b57cSdlg 	void *dummy1;
109893c7b57cSdlg 	int dummy2;
109993c7b57cSdlg 	void *dummy3;
110093c7b57cSdlg 	int __x;
1101e39f036fSguenther 	__asm volatile(
110293c7b57cSdlg 	"1:	movw (%2),%%ax				;"
110393c7b57cSdlg 	"	stosw					;"
110493c7b57cSdlg 	"	loop 1b"				:
110593c7b57cSdlg 	    "=D" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) :
110693c7b57cSdlg 	    "0" ((ptr)), "1" ((cnt)), "2" (h + o)       :
110793c7b57cSdlg 	    "memory");
110893c7b57cSdlg }
110993c7b57cSdlg 
111093c7b57cSdlg void
x86_bus_space_mem_read_multi_4(bus_space_handle_t h,bus_size_t o,u_int32_t * ptr,bus_size_t cnt)111193c7b57cSdlg x86_bus_space_mem_read_multi_4(bus_space_handle_t h, bus_size_t o,
111293c7b57cSdlg     u_int32_t *ptr, bus_size_t cnt)
111393c7b57cSdlg {
111493c7b57cSdlg 	void *dummy1;
111593c7b57cSdlg 	int dummy2;
111693c7b57cSdlg 	void *dummy3;
111793c7b57cSdlg 	int __x;
1118e39f036fSguenther 	__asm volatile(
111993c7b57cSdlg 	"1:	movl (%2),%%eax				;"
112093c7b57cSdlg 	"	stosl					;"
112193c7b57cSdlg 	"	loop 1b"				:
112293c7b57cSdlg 	    "=D" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) :
112393c7b57cSdlg 	    "0" ((ptr)), "1" ((cnt)), "2" (h + o)       :
112493c7b57cSdlg 	    "memory");
112593c7b57cSdlg }
112693c7b57cSdlg 
112793c7b57cSdlg void
x86_bus_space_mem_read_multi_8(bus_space_handle_t h,bus_size_t o,u_int64_t * ptr,bus_size_t cnt)112893c7b57cSdlg x86_bus_space_mem_read_multi_8(bus_space_handle_t h, bus_size_t o,
112993c7b57cSdlg     u_int64_t *ptr, bus_size_t cnt)
113093c7b57cSdlg {
113193c7b57cSdlg 	void *dummy1;
113293c7b57cSdlg 	int dummy2;
113393c7b57cSdlg 	void *dummy3;
113493c7b57cSdlg 	int __x;
1135e39f036fSguenther 	__asm volatile(
113693c7b57cSdlg 	"1:	movq (%2),%%rax				;"
113793c7b57cSdlg 	"	stosq					;"
113893c7b57cSdlg 	"	loop 1b"				:
113993c7b57cSdlg 	    "=D" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) :
114093c7b57cSdlg 	    "0" ((ptr)), "1" ((cnt)), "2" (h + o)       :
114193c7b57cSdlg 	    "memory");
114293c7b57cSdlg }
114393c7b57cSdlg 
114493c7b57cSdlg void
x86_bus_space_mem_read_region_1(bus_space_handle_t h,bus_size_t o,u_int8_t * ptr,bus_size_t cnt)114593c7b57cSdlg x86_bus_space_mem_read_region_1(bus_space_handle_t h,
114693c7b57cSdlg     bus_size_t o, u_int8_t *ptr, bus_size_t cnt)
114793c7b57cSdlg {
114893c7b57cSdlg 	int dummy1;
114993c7b57cSdlg 	void *dummy2;
115093c7b57cSdlg 	int dummy3;
1151e39f036fSguenther 	__asm volatile(
115293c7b57cSdlg 	"	repne					;"
115393c7b57cSdlg 	"	movsb"					:
115493c7b57cSdlg 	    "=S" (dummy1), "=D" (dummy2), "=c" (dummy3)	:
115593c7b57cSdlg 	    "0" (h + o), "1" (ptr), "2" (cnt)	:
115693c7b57cSdlg 	    "memory");
115793c7b57cSdlg }
115893c7b57cSdlg 
115993c7b57cSdlg void
x86_bus_space_mem_read_region_2(bus_space_handle_t h,bus_size_t o,u_int16_t * ptr,bus_size_t cnt)116093c7b57cSdlg x86_bus_space_mem_read_region_2(bus_space_handle_t h,
116193c7b57cSdlg     bus_size_t o, u_int16_t *ptr, bus_size_t cnt)
116293c7b57cSdlg {
116393c7b57cSdlg 	int dummy1;
116493c7b57cSdlg 	void *dummy2;
116593c7b57cSdlg 	int dummy3;
1166e39f036fSguenther 	__asm volatile(
116793c7b57cSdlg 	"	repne					;"
116893c7b57cSdlg 	"	movsw"					:
116993c7b57cSdlg 	    "=S" (dummy1), "=D" (dummy2), "=c" (dummy3)	:
117093c7b57cSdlg 	    "0" (h + o), "1" (ptr), "2" (cnt)	:
117193c7b57cSdlg 	    "memory");
117293c7b57cSdlg }
117393c7b57cSdlg 
117493c7b57cSdlg void
x86_bus_space_mem_read_region_4(bus_space_handle_t h,bus_size_t o,u_int32_t * ptr,bus_size_t cnt)117593c7b57cSdlg x86_bus_space_mem_read_region_4(bus_space_handle_t h,
117693c7b57cSdlg     bus_size_t o, u_int32_t *ptr, bus_size_t cnt)
117793c7b57cSdlg {
117893c7b57cSdlg 	int dummy1;
117993c7b57cSdlg 	void *dummy2;
118093c7b57cSdlg 	int dummy3;
1181e39f036fSguenther 	__asm volatile(
118293c7b57cSdlg 	"	repne					;"
118393c7b57cSdlg 	"	movsl"					:
118493c7b57cSdlg 	    "=S" (dummy1), "=D" (dummy2), "=c" (dummy3)	:
118593c7b57cSdlg 	    "0" (h + o), "1" (ptr), "2" (cnt)	:
118693c7b57cSdlg 	    "memory");
118793c7b57cSdlg }
118893c7b57cSdlg 
118993c7b57cSdlg void
x86_bus_space_mem_read_region_8(bus_space_handle_t h,bus_size_t o,u_int64_t * ptr,bus_size_t cnt)119093c7b57cSdlg x86_bus_space_mem_read_region_8(bus_space_handle_t h,
119193c7b57cSdlg     bus_size_t o, u_int64_t *ptr, bus_size_t cnt)
119293c7b57cSdlg {
119393c7b57cSdlg 	int dummy1;
119493c7b57cSdlg 	void *dummy2;
119593c7b57cSdlg 	int dummy3;
1196e39f036fSguenther 	__asm volatile(
119793c7b57cSdlg 	"	repne					;"
119893c7b57cSdlg 	"	movsq"					:
119993c7b57cSdlg 	    "=S" (dummy1), "=D" (dummy2), "=c" (dummy3)	:
120093c7b57cSdlg 	    "0" (h + o), "1" (ptr), "2" (cnt)	:
120193c7b57cSdlg 	    "memory");
120293c7b57cSdlg }
120393c7b57cSdlg 
120493c7b57cSdlg void
x86_bus_space_mem_write_4(bus_space_handle_t h,bus_size_t o,u_int32_t v)120593c7b57cSdlg x86_bus_space_mem_write_4(bus_space_handle_t h, bus_size_t o, u_int32_t v)
120693c7b57cSdlg {
120793c7b57cSdlg 	*(volatile u_int32_t *)(h + o) = v;
120893c7b57cSdlg }
120993c7b57cSdlg 
121093c7b57cSdlg void
x86_bus_space_mem_write_8(bus_space_handle_t h,bus_size_t o,u_int64_t v)121193c7b57cSdlg x86_bus_space_mem_write_8(bus_space_handle_t h, bus_size_t o, u_int64_t v)
121293c7b57cSdlg {
121393c7b57cSdlg 	*(volatile u_int64_t *)(h + o) = v;
121493c7b57cSdlg }
121593c7b57cSdlg 
121693c7b57cSdlg void
x86_bus_space_mem_write_multi_1(bus_space_handle_t h,bus_size_t o,const u_int8_t * ptr,bus_size_t cnt)121793c7b57cSdlg x86_bus_space_mem_write_multi_1(bus_space_handle_t h,
121893c7b57cSdlg     bus_size_t o, const u_int8_t *ptr, bus_size_t cnt)
121993c7b57cSdlg {
122093c7b57cSdlg 	void *dummy1;
122193c7b57cSdlg 	int dummy2;
122293c7b57cSdlg 	void *dummy3;
122393c7b57cSdlg 	int __x;
1224e39f036fSguenther 	__asm volatile(
122593c7b57cSdlg 	"1:	lodsb					;"
122693c7b57cSdlg 	"	movb %%al,(%2)				;"
122793c7b57cSdlg 	"	loop 1b"				:
122893c7b57cSdlg 	    "=S" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) :
122993c7b57cSdlg 	    "0" (ptr), "1" (cnt), "2" (h + o));
123093c7b57cSdlg }
123193c7b57cSdlg 
123293c7b57cSdlg void
x86_bus_space_mem_write_multi_2(bus_space_handle_t h,bus_size_t o,const u_int16_t * ptr,bus_size_t cnt)123393c7b57cSdlg x86_bus_space_mem_write_multi_2(bus_space_handle_t h,
123493c7b57cSdlg     bus_size_t o, const u_int16_t *ptr, bus_size_t cnt)
123593c7b57cSdlg {
123693c7b57cSdlg 	void *dummy1;
123793c7b57cSdlg 	int dummy2;
123893c7b57cSdlg 	void *dummy3;
123993c7b57cSdlg 	int __x;
1240e39f036fSguenther 	__asm volatile(
124193c7b57cSdlg 	"1:	lodsw					;"
124293c7b57cSdlg 	"	movw %%ax,(%2)				;"
124393c7b57cSdlg 	"	loop 1b"				:
124493c7b57cSdlg 	    "=S" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) :
124593c7b57cSdlg 	    "0" (ptr), "1" (cnt), "2" (h + o));
124693c7b57cSdlg }
124793c7b57cSdlg 
124893c7b57cSdlg void
x86_bus_space_mem_write_multi_4(bus_space_handle_t h,bus_size_t o,const u_int32_t * ptr,bus_size_t cnt)124993c7b57cSdlg x86_bus_space_mem_write_multi_4(bus_space_handle_t h,
125093c7b57cSdlg     bus_size_t o, const u_int32_t *ptr, bus_size_t cnt)
125193c7b57cSdlg {
125293c7b57cSdlg 	void *dummy1;
125393c7b57cSdlg 	int dummy2;
125493c7b57cSdlg 	void *dummy3;
125593c7b57cSdlg 	int __x;
1256e39f036fSguenther 	__asm volatile(
125793c7b57cSdlg 	"1:	lodsl					;"
125893c7b57cSdlg 	"	movl %%eax,(%2)				;"
125993c7b57cSdlg 	"	loop 1b"				:
126093c7b57cSdlg 	    "=S" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) :
126193c7b57cSdlg 	    "0" (ptr), "1" (cnt), "2" (h + o));
126293c7b57cSdlg }
126393c7b57cSdlg 
126493c7b57cSdlg void
x86_bus_space_mem_write_multi_8(bus_space_handle_t h,bus_size_t o,const u_int64_t * ptr,bus_size_t cnt)126593c7b57cSdlg x86_bus_space_mem_write_multi_8(bus_space_handle_t h,
126693c7b57cSdlg     bus_size_t o, const u_int64_t *ptr, bus_size_t cnt)
126793c7b57cSdlg {
126893c7b57cSdlg 	void *dummy1;
126993c7b57cSdlg 	int dummy2;
127093c7b57cSdlg 	void *dummy3;
127193c7b57cSdlg 	int __x;
1272e39f036fSguenther 	__asm volatile(
127393c7b57cSdlg 	"1:	lodsq					;"
127493c7b57cSdlg 	"	movq %%rax,(%2)				;"
127593c7b57cSdlg 	"	loop 1b"				:
127693c7b57cSdlg 	    "=S" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) :
127793c7b57cSdlg 	    "0" (ptr), "1" (cnt), "2" (h + o));
127893c7b57cSdlg }
127993c7b57cSdlg 
128093c7b57cSdlg void
x86_bus_space_mem_write_region_1(bus_space_handle_t h,bus_size_t o,const u_int8_t * ptr,bus_size_t cnt)128193c7b57cSdlg x86_bus_space_mem_write_region_1(bus_space_handle_t h,
128293c7b57cSdlg     bus_size_t o, const u_int8_t *ptr, bus_size_t cnt)
128393c7b57cSdlg {
128493c7b57cSdlg 	int dummy1;
128593c7b57cSdlg 	void *dummy2;
128693c7b57cSdlg 	int dummy3;
1287e39f036fSguenther 	__asm volatile(
128893c7b57cSdlg 	"	repne					;"
128993c7b57cSdlg 	"	movsb"					:
129093c7b57cSdlg 	    "=D" (dummy1), "=S" (dummy2), "=c" (dummy3)	:
129193c7b57cSdlg 	    "0" (h + o), "1" (ptr), "2" (cnt)	:
129293c7b57cSdlg 	    "memory");
129393c7b57cSdlg }
129493c7b57cSdlg 
129593c7b57cSdlg void
x86_bus_space_mem_write_region_2(bus_space_handle_t h,bus_size_t o,const u_int16_t * ptr,bus_size_t cnt)129693c7b57cSdlg x86_bus_space_mem_write_region_2(bus_space_handle_t h,
129793c7b57cSdlg     bus_size_t o, const u_int16_t *ptr, bus_size_t cnt)
129893c7b57cSdlg {
129993c7b57cSdlg 	int dummy1;
130093c7b57cSdlg 	void *dummy2;
130193c7b57cSdlg 	int dummy3;
1302e39f036fSguenther 	__asm volatile(
130393c7b57cSdlg 	"	repne					;"
130493c7b57cSdlg 	"	movsw"					:
130593c7b57cSdlg 	    "=D" (dummy1), "=S" (dummy2), "=c" (dummy3)	:
130693c7b57cSdlg 	    "0" (h + o), "1" (ptr), "2" (cnt)	:
130793c7b57cSdlg 	    "memory");
130893c7b57cSdlg }
130993c7b57cSdlg 
131093c7b57cSdlg void
x86_bus_space_mem_write_region_4(bus_space_handle_t h,bus_size_t o,const u_int32_t * ptr,bus_size_t cnt)131193c7b57cSdlg x86_bus_space_mem_write_region_4(bus_space_handle_t h,
131293c7b57cSdlg     bus_size_t o, const u_int32_t *ptr, bus_size_t cnt)
131393c7b57cSdlg {
1314ebbaad44Soga 	int dummy1;
1315ebbaad44Soga 	void *dummy2;
1316ebbaad44Soga 	int dummy3;
1317e39f036fSguenther 	__asm volatile(
1318ebbaad44Soga 	"	repne					;"
1319ebbaad44Soga 	"	movsl"					:
1320ebbaad44Soga 	    "=D" (dummy1), "=S" (dummy2), "=c" (dummy3)	:
1321ebbaad44Soga 	    "0" (h + o), "1" (ptr), "2" (cnt)	:
1322ebbaad44Soga 	    "memory");
1323ebbaad44Soga }
1324ebbaad44Soga 
1325ebbaad44Soga void
x86_bus_space_mem_write_region_8(bus_space_handle_t h,bus_size_t o,const u_int64_t * ptr,bus_size_t cnt)132693c7b57cSdlg x86_bus_space_mem_write_region_8(bus_space_handle_t h,
13279f2791f2Sdlg     bus_size_t o, const u_int64_t *ptr, bus_size_t cnt)
13289f2791f2Sdlg {
13299f2791f2Sdlg 	int dummy1;
13309f2791f2Sdlg 	void *dummy2;
13319f2791f2Sdlg 	int dummy3;
1332e39f036fSguenther 	__asm volatile(
13339f2791f2Sdlg 	"	repne					;"
13349f2791f2Sdlg 	"	movsq"					:
13359f2791f2Sdlg 	    "=D" (dummy1), "=S" (dummy2), "=c" (dummy3)	:
13369f2791f2Sdlg 	    "0" (h + o), "1" (ptr), "2" (cnt)	:
13379f2791f2Sdlg 	    "memory");
13389f2791f2Sdlg }
13399f2791f2Sdlg 
13409f2791f2Sdlg void
x86_bus_space_mem_set_multi_1(bus_space_handle_t h,bus_size_t o,u_int8_t v,size_t c)134193c7b57cSdlg x86_bus_space_mem_set_multi_1(bus_space_handle_t h, bus_size_t o,
1342ebbaad44Soga     u_int8_t v, size_t c)
1343ebbaad44Soga {
1344ebbaad44Soga 	bus_addr_t addr = h + o;
1345ebbaad44Soga 
1346ebbaad44Soga 	while (c--)
1347ebbaad44Soga 		*(volatile u_int8_t *)(addr) = v;
1348ebbaad44Soga }
1349ebbaad44Soga 
1350ebbaad44Soga void
x86_bus_space_mem_set_multi_2(bus_space_handle_t h,bus_size_t o,u_int16_t v,size_t c)135193c7b57cSdlg x86_bus_space_mem_set_multi_2(bus_space_handle_t h, bus_size_t o,
1352ebbaad44Soga     u_int16_t v, size_t c)
1353ebbaad44Soga {
1354ebbaad44Soga 	bus_addr_t addr = h + o;
1355ebbaad44Soga 
1356ebbaad44Soga 	while (c--)
1357ebbaad44Soga 		*(volatile u_int16_t *)(addr) = v;
1358ebbaad44Soga }
1359ebbaad44Soga 
1360ebbaad44Soga void
x86_bus_space_mem_set_multi_4(bus_space_handle_t h,bus_size_t o,u_int32_t v,size_t c)136193c7b57cSdlg x86_bus_space_mem_set_multi_4(bus_space_handle_t h, bus_size_t o,
1362ebbaad44Soga     u_int32_t v, size_t c)
1363ebbaad44Soga {
1364ebbaad44Soga 	bus_addr_t addr = h + o;
1365ebbaad44Soga 
1366ebbaad44Soga 	while (c--)
1367ebbaad44Soga 		*(volatile u_int32_t *)(addr) = v;
1368ebbaad44Soga }
1369ebbaad44Soga 
1370ebbaad44Soga void
x86_bus_space_mem_set_multi_8(bus_space_handle_t h,bus_size_t o,u_int64_t v,size_t c)137193c7b57cSdlg x86_bus_space_mem_set_multi_8(bus_space_handle_t h, bus_size_t o,
13729f2791f2Sdlg     u_int64_t v, size_t c)
13739f2791f2Sdlg {
13749f2791f2Sdlg 	bus_addr_t addr = h + o;
13759f2791f2Sdlg 
13769f2791f2Sdlg 	while (c--)
13779f2791f2Sdlg 		*(volatile u_int64_t *)(addr) = v;
13789f2791f2Sdlg }
13799f2791f2Sdlg 
13809f2791f2Sdlg void
x86_bus_space_mem_set_region_1(bus_space_handle_t h,bus_size_t o,u_int8_t v,size_t c)138193c7b57cSdlg x86_bus_space_mem_set_region_1(bus_space_handle_t h, bus_size_t o,
1382ebbaad44Soga     u_int8_t v, size_t c)
1383ebbaad44Soga {
1384ebbaad44Soga 	bus_addr_t addr = h + o;
1385ebbaad44Soga 
1386ebbaad44Soga 	for (; c != 0; c--, addr++)
1387ebbaad44Soga 		*(volatile u_int8_t *)(addr) = v;
1388ebbaad44Soga }
1389ebbaad44Soga 
1390ebbaad44Soga void
x86_bus_space_mem_set_region_2(bus_space_handle_t h,bus_size_t o,u_int16_t v,size_t c)139193c7b57cSdlg x86_bus_space_mem_set_region_2(bus_space_handle_t h, bus_size_t o,
1392ebbaad44Soga     u_int16_t v, size_t c)
1393ebbaad44Soga {
1394ebbaad44Soga 	bus_addr_t addr = h + o;
1395ebbaad44Soga 
139693c7b57cSdlg 	for (; c != 0; c--, addr += sizeof(v))
1397ebbaad44Soga 		*(volatile u_int16_t *)(addr) = v;
1398ebbaad44Soga }
1399ebbaad44Soga 
1400ebbaad44Soga void
x86_bus_space_mem_set_region_4(bus_space_handle_t h,bus_size_t o,u_int32_t v,size_t c)140193c7b57cSdlg x86_bus_space_mem_set_region_4(bus_space_handle_t h, bus_size_t o,
1402ebbaad44Soga     u_int32_t v, size_t c)
1403ebbaad44Soga {
1404ebbaad44Soga 	bus_addr_t addr = h + o;
1405ebbaad44Soga 
140693c7b57cSdlg 	for (; c != 0; c--, addr += sizeof(v))
1407ebbaad44Soga 		*(volatile u_int32_t *)(addr) = v;
1408ebbaad44Soga }
1409ebbaad44Soga 
1410ebbaad44Soga void
x86_bus_space_mem_set_region_8(bus_space_handle_t h,bus_size_t o,u_int64_t v,size_t c)141193c7b57cSdlg x86_bus_space_mem_set_region_8(bus_space_handle_t h, bus_size_t o,
14129f2791f2Sdlg     u_int64_t v, size_t c)
14139f2791f2Sdlg {
14149f2791f2Sdlg 	bus_addr_t addr = h + o;
14159f2791f2Sdlg 
14169f2791f2Sdlg 	for (; c != 0; c--, addr += sizeof(v))
14179f2791f2Sdlg 		*(volatile u_int64_t *)(addr) = v;
14189f2791f2Sdlg }
14199f2791f2Sdlg 
14209f2791f2Sdlg void
x86_bus_space_mem_copy_1(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,size_t c)142193c7b57cSdlg x86_bus_space_mem_copy_1( bus_space_handle_t h1, bus_size_t o1,
1422ebbaad44Soga     bus_space_handle_t h2, bus_size_t o2, size_t c)
1423ebbaad44Soga {
1424ebbaad44Soga 	bus_addr_t addr1 = h1 + o1;
1425ebbaad44Soga 	bus_addr_t addr2 = h2 + o2;
1426ebbaad44Soga 
1427ebbaad44Soga 	if (addr1 >= addr2) {
1428ebbaad44Soga 		/* src after dest: copy forward */
1429ebbaad44Soga 		for (; c != 0; c--, addr1++, addr2++)
1430ebbaad44Soga 			*(volatile u_int8_t *)(addr2) =
1431ebbaad44Soga 			    *(volatile u_int8_t *)(addr1);
1432ebbaad44Soga 	} else {
1433ebbaad44Soga 		/* dest after src: copy backwards */
1434ebbaad44Soga 		for (addr1 += (c - 1), addr2 += (c - 1);
1435ebbaad44Soga 		    c != 0; c--, addr1--, addr2--)
1436ebbaad44Soga 			*(volatile u_int8_t *)(addr2) =
1437ebbaad44Soga 			    *(volatile u_int8_t *)(addr1);
1438ebbaad44Soga 	}
1439ebbaad44Soga }
1440ebbaad44Soga 
1441ebbaad44Soga void
x86_bus_space_mem_copy_2(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,size_t c)144293c7b57cSdlg x86_bus_space_mem_copy_2(bus_space_handle_t h1, bus_size_t o1,
1443ebbaad44Soga     bus_space_handle_t h2, bus_size_t o2, size_t c)
1444ebbaad44Soga {
1445ebbaad44Soga 	bus_addr_t addr1 = h1 + o1;
1446ebbaad44Soga 	bus_addr_t addr2 = h2 + o2;
1447ebbaad44Soga 
1448ebbaad44Soga 	if (addr1 >= addr2) {
1449ebbaad44Soga 		/* src after dest: copy forward */
1450ebbaad44Soga 		for (; c != 0; c--, addr1 += 2, addr2 += 2)
1451ebbaad44Soga 			*(volatile u_int16_t *)(addr2) =
1452ebbaad44Soga 			    *(volatile u_int16_t *)(addr1);
1453ebbaad44Soga 	} else {
1454ebbaad44Soga 		/* dest after src: copy backwards */
1455ebbaad44Soga 		for (addr1 += 2 * (c - 1), addr2 += 2 * (c - 1);
1456ebbaad44Soga 		    c != 0; c--, addr1 -= 2, addr2 -= 2)
1457ebbaad44Soga 			*(volatile u_int16_t *)(addr2) =
1458ebbaad44Soga 			    *(volatile u_int16_t *)(addr1);
1459ebbaad44Soga 	}
1460ebbaad44Soga }
1461ebbaad44Soga 
1462ebbaad44Soga void
x86_bus_space_mem_copy_4(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,size_t c)146393c7b57cSdlg x86_bus_space_mem_copy_4(bus_space_handle_t h1, bus_size_t o1,
1464ebbaad44Soga     bus_space_handle_t h2, bus_size_t o2, size_t c)
1465ebbaad44Soga {
1466ebbaad44Soga 	bus_addr_t addr1 = h1 + o1;
1467ebbaad44Soga 	bus_addr_t addr2 = h2 + o2;
1468ebbaad44Soga 
1469ebbaad44Soga 	if (addr1 >= addr2) {
1470ebbaad44Soga 		/* src after dest: copy forward */
1471ebbaad44Soga 		for (; c != 0; c--, addr1 += 4, addr2 += 4)
1472ebbaad44Soga 			*(volatile u_int32_t *)(addr2) =
1473ebbaad44Soga 			    *(volatile u_int32_t *)(addr1);
1474ebbaad44Soga 	} else {
1475ebbaad44Soga 		/* dest after src: copy backwards */
1476ebbaad44Soga 		for (addr1 += 4 * (c - 1), addr2 += 4 * (c - 1);
1477ebbaad44Soga 		    c != 0; c--, addr1 -= 4, addr2 -= 4)
1478ebbaad44Soga 			*(volatile u_int32_t *)(addr2) =
1479ebbaad44Soga 			    *(volatile u_int32_t *)(addr1);
1480ebbaad44Soga 	}
1481ebbaad44Soga }
1482ebbaad44Soga 
1483ebbaad44Soga void
x86_bus_space_mem_copy_8(bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,size_t c)148493c7b57cSdlg x86_bus_space_mem_copy_8(bus_space_handle_t h1, bus_size_t o1,
14859f2791f2Sdlg     bus_space_handle_t h2, bus_size_t o2, size_t c)
14869f2791f2Sdlg {
14879f2791f2Sdlg 	bus_addr_t addr1 = h1 + o1;
14889f2791f2Sdlg 	bus_addr_t addr2 = h2 + o2;
14899f2791f2Sdlg 
14909f2791f2Sdlg 	if (addr1 >= addr2) {
14919f2791f2Sdlg 		/* src after dest: copy forward */
14929f2791f2Sdlg 		for (; c != 0; c--, addr1 += 8, addr2 += 8)
14939f2791f2Sdlg 			*(volatile u_int64_t *)(addr2) =
14949f2791f2Sdlg 			    *(volatile u_int64_t *)(addr1);
14959f2791f2Sdlg 	} else {
14969f2791f2Sdlg 		/* dest after src: copy backwards */
14979f2791f2Sdlg 		for (addr1 += 8 * (c - 1), addr2 += 8 * (c - 1);
14989f2791f2Sdlg 		    c != 0; c--, addr1 -= 8, addr2 -= 8)
14999f2791f2Sdlg 			*(volatile u_int64_t *)(addr2) =
15009f2791f2Sdlg 			    *(volatile u_int64_t *)(addr1);
15019f2791f2Sdlg 	}
15029f2791f2Sdlg }
15039f2791f2Sdlg 
150493c7b57cSdlg void *
x86_bus_space_mem_vaddr(bus_space_handle_t h)150593c7b57cSdlg x86_bus_space_mem_vaddr(bus_space_handle_t h)
1506ebbaad44Soga {
150793c7b57cSdlg 	return ((void *)h);
1508ebbaad44Soga }
1509ebbaad44Soga 
151093c7b57cSdlg paddr_t
x86_bus_space_mem_mmap(bus_addr_t addr,off_t off,int prot,int flags)151193c7b57cSdlg x86_bus_space_mem_mmap(bus_addr_t addr, off_t off, int prot, int flags)
151293c7b57cSdlg {
151393c7b57cSdlg 	/*
151493c7b57cSdlg 	 * "addr" is the base address of the device we're mapping.
151593c7b57cSdlg 	 * "off" is the offset into that device.
151693c7b57cSdlg 	 *
151793c7b57cSdlg 	 * Note we are called for each "page" in the device that
151893c7b57cSdlg 	 * the upper layers want to map.
151993c7b57cSdlg 	 */
152093c7b57cSdlg 	return (addr + off);
152193c7b57cSdlg }
1522