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