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