diff options
author | David Gwynne <dlg@cvs.openbsd.org> | 2014-10-17 01:46:27 +0000 |
---|---|---|
committer | David Gwynne <dlg@cvs.openbsd.org> | 2014-10-17 01:46:27 +0000 |
commit | 74fe337c10141c7b46dc14a8fc44882a404a47d6 (patch) | |
tree | 27b3f927aaf29fad7e5e732c2917278978cb1557 /sys | |
parent | 9d179a1e4d1b28a722089050a209000c738a4b09 (diff) |
bring the twisting of bus_space from amd64 over to i386. this is:
src/sys/arch/amd64/amd64/bus_space.c r1.22
src/sys/arch/amd64/include/bus.h r1.27
instead of using the tag as an identifier for IO or memory mappings
that was checked inside the api, turn it into a pointer to a structure
of function pointers. the api then generally becomes a set of macros
that deref the function pointers on the callers behalf. the idea
is that following a pointer to very small functions is cheap compared
to doing compares continuously.
the kernel is smaller and the api is more cache friendly now.
the porting of this code from amd64 to i386 was done by kimberley manning
requested by and ok tedu@
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/i386/i386/bus_space.c | 981 | ||||
-rw-r--r-- | sys/arch/i386/i386/machdep.c | 24 | ||||
-rw-r--r-- | sys/arch/i386/include/bus.h | 229 |
3 files changed, 823 insertions, 411 deletions
diff --git a/sys/arch/i386/i386/bus_space.c b/sys/arch/i386/i386/bus_space.c index 83454b80c95..6573180a6a0 100644 --- a/sys/arch/i386/i386/bus_space.c +++ b/sys/arch/i386/i386/bus_space.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bus_space.c,v 1.5 2014/03/29 18:09:29 guenther Exp $ */ +/* $OpenBSD: bus_space.c,v 1.6 2014/10/17 01:46:26 dlg Exp $ */ /*- * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc. * All rights reserved. @@ -68,486 +68,849 @@ #include <machine/bus.h> +u_int8_t i386_bus_space_io_read_1(bus_space_handle_t, bus_size_t); +u_int16_t i386_bus_space_io_read_2(bus_space_handle_t, bus_size_t); +u_int32_t i386_bus_space_io_read_4(bus_space_handle_t, bus_size_t); + +void i386_bus_space_io_read_multi_1(bus_space_handle_t, bus_size_t, + u_int8_t *, bus_size_t); +void i386_bus_space_io_read_multi_2(bus_space_handle_t, bus_size_t, + u_int16_t *, bus_size_t); +void i386_bus_space_io_read_multi_4(bus_space_handle_t, bus_size_t, + u_int32_t *, bus_size_t); + +void i386_bus_space_io_read_region_1(bus_space_handle_t, bus_size_t, + u_int8_t *, bus_size_t); +void i386_bus_space_io_read_region_2(bus_space_handle_t, bus_size_t, + u_int16_t *, bus_size_t); +void i386_bus_space_io_read_region_4(bus_space_handle_t, bus_size_t, + u_int32_t *, bus_size_t); + +void i386_bus_space_io_write_1(bus_space_handle_t, bus_size_t, + u_int8_t); +void i386_bus_space_io_write_2(bus_space_handle_t, bus_size_t, + u_int16_t); +void i386_bus_space_io_write_4(bus_space_handle_t, bus_size_t, + u_int32_t); + +void i386_bus_space_io_write_multi_1(bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); +void i386_bus_space_io_write_multi_2(bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); +void i386_bus_space_io_write_multi_4(bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); + +void i386_bus_space_io_write_region_1(bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); +void i386_bus_space_io_write_region_2(bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); +void i386_bus_space_io_write_region_4(bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); + +void i386_bus_space_io_set_multi_1(bus_space_handle_t, bus_size_t, + u_int8_t, size_t); +void i386_bus_space_io_set_multi_2(bus_space_handle_t, bus_size_t, + u_int16_t, size_t); +void i386_bus_space_io_set_multi_4(bus_space_handle_t, bus_size_t, + u_int32_t, size_t); + +void i386_bus_space_io_set_region_1(bus_space_handle_t, bus_size_t, + u_int8_t, size_t); +void i386_bus_space_io_set_region_2(bus_space_handle_t, bus_size_t, + u_int16_t, size_t); +void i386_bus_space_io_set_region_4(bus_space_handle_t, bus_size_t, + u_int32_t, size_t); + +void i386_bus_space_io_copy_1(bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, size_t); +void i386_bus_space_io_copy_2(bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, size_t); +void i386_bus_space_io_copy_4(bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, size_t); + +void * i386_bus_space_io_vaddr(bus_space_handle_t); +paddr_t i386_bus_space_io_mmap(bus_addr_t, off_t, int, int); + +const struct i386_bus_space_ops i386_bus_space_io_ops = { + i386_bus_space_io_read_1, + i386_bus_space_io_read_2, + i386_bus_space_io_read_4, + i386_bus_space_io_read_multi_1, + i386_bus_space_io_read_multi_2, + i386_bus_space_io_read_multi_4, + i386_bus_space_io_read_region_1, + i386_bus_space_io_read_region_2, + i386_bus_space_io_read_region_4, + i386_bus_space_io_write_1, + i386_bus_space_io_write_2, + i386_bus_space_io_write_4, + i386_bus_space_io_write_multi_1, + i386_bus_space_io_write_multi_2, + i386_bus_space_io_write_multi_4, + i386_bus_space_io_write_region_1, + i386_bus_space_io_write_region_2, + i386_bus_space_io_write_region_4, + i386_bus_space_io_set_multi_1, + i386_bus_space_io_set_multi_2, + i386_bus_space_io_set_multi_4, + i386_bus_space_io_set_region_1, + i386_bus_space_io_set_region_2, + i386_bus_space_io_set_region_4, + i386_bus_space_io_copy_1, + i386_bus_space_io_copy_2, + i386_bus_space_io_copy_4, + i386_bus_space_io_vaddr, +}; + +u_int8_t i386_bus_space_mem_read_1(bus_space_handle_t, bus_size_t); +u_int16_t i386_bus_space_mem_read_2(bus_space_handle_t, bus_size_t); +u_int32_t i386_bus_space_mem_read_4(bus_space_handle_t, bus_size_t); + +void i386_bus_space_mem_read_multi_1(bus_space_handle_t, bus_size_t, + u_int8_t *, bus_size_t); +void i386_bus_space_mem_read_multi_2(bus_space_handle_t, bus_size_t, + u_int16_t *, bus_size_t); +void i386_bus_space_mem_read_multi_4(bus_space_handle_t, bus_size_t, + u_int32_t *, bus_size_t); + +void i386_bus_space_mem_read_region_1(bus_space_handle_t, bus_size_t, + u_int8_t *, bus_size_t); +void i386_bus_space_mem_read_region_2(bus_space_handle_t, bus_size_t, + u_int16_t *, bus_size_t); +void i386_bus_space_mem_read_region_4(bus_space_handle_t, bus_size_t, + u_int32_t *, bus_size_t); + +void i386_bus_space_mem_write_1(bus_space_handle_t, bus_size_t, + u_int8_t); +void i386_bus_space_mem_write_2(bus_space_handle_t, bus_size_t, + u_int16_t); +void i386_bus_space_mem_write_4(bus_space_handle_t, bus_size_t, + u_int32_t); + +void i386_bus_space_mem_write_multi_1(bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); +void i386_bus_space_mem_write_multi_2(bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); +void i386_bus_space_mem_write_multi_4(bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); + +void i386_bus_space_mem_write_region_1(bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); +void i386_bus_space_mem_write_region_2(bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); +void i386_bus_space_mem_write_region_4(bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); + +void i386_bus_space_mem_set_multi_1(bus_space_handle_t, bus_size_t, + u_int8_t, size_t); +void i386_bus_space_mem_set_multi_2(bus_space_handle_t, bus_size_t, + u_int16_t, size_t); +void i386_bus_space_mem_set_multi_4(bus_space_handle_t, bus_size_t, + u_int32_t, size_t); + +void i386_bus_space_mem_set_region_1(bus_space_handle_t, bus_size_t, + u_int8_t, size_t); +void i386_bus_space_mem_set_region_2(bus_space_handle_t, bus_size_t, + u_int16_t, size_t); +void i386_bus_space_mem_set_region_4(bus_space_handle_t, bus_size_t, + u_int32_t, size_t); + +void i386_bus_space_mem_copy_1(bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, size_t); +void i386_bus_space_mem_copy_2(bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, size_t); +void i386_bus_space_mem_copy_4(bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, size_t); + +void * i386_bus_space_mem_vaddr(bus_space_handle_t); +paddr_t i386_bus_space_mem_mmap(bus_addr_t, off_t, int, int); + +const struct i386_bus_space_ops i386_bus_space_mem_ops = { + i386_bus_space_mem_read_1, + i386_bus_space_mem_read_2, + i386_bus_space_mem_read_4, + i386_bus_space_mem_read_multi_1, + i386_bus_space_mem_read_multi_2, + i386_bus_space_mem_read_multi_4, + i386_bus_space_mem_read_region_1, + i386_bus_space_mem_read_region_2, + i386_bus_space_mem_read_region_4, + i386_bus_space_mem_write_1, + i386_bus_space_mem_write_2, + i386_bus_space_mem_write_4, + i386_bus_space_mem_write_multi_1, + i386_bus_space_mem_write_multi_2, + i386_bus_space_mem_write_multi_4, + i386_bus_space_mem_write_region_1, + i386_bus_space_mem_write_region_2, + i386_bus_space_mem_write_region_4, + i386_bus_space_mem_set_multi_1, + i386_bus_space_mem_set_multi_2, + i386_bus_space_mem_set_multi_4, + i386_bus_space_mem_set_region_1, + i386_bus_space_mem_set_region_2, + i386_bus_space_mem_set_region_4, + i386_bus_space_mem_copy_1, + i386_bus_space_mem_copy_2, + i386_bus_space_mem_copy_4, + i386_bus_space_mem_vaddr, +}; + u_int8_t -bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o) +i386_bus_space_io_read_1(bus_space_handle_t h, bus_size_t o) { - return ((t) == I386_BUS_SPACE_IO ? (inb((h) + (o))) : - (*(volatile u_int8_t *)((h) + (o)))); + return (inb(h + o)); } u_int16_t -bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o) +i386_bus_space_io_read_2(bus_space_handle_t h, bus_size_t o) { - return ((t) == I386_BUS_SPACE_IO ? (inw((h) + (o))) : - (*(volatile u_int16_t *)((h) + (o)))); + return (inw(h + o)); } u_int32_t -bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o) +i386_bus_space_io_read_4(bus_space_handle_t h, bus_size_t o) +{ + return (inl(h + o)); +} + +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) +{ + insb(h + o, a, cnt); +} + +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) +{ + insw(h + o, a, cnt); +} + +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) +{ + insl(h + o, a, cnt); +} + +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) +{ + int _cnt = cnt; + void *_addr = a; + int _port = h + o; + + __asm volatile("cld ;" + "1: inb %w2,%%al ;" + " stosb ;" + " incl %2 ;" + " loop 1b" : + "+D" (_addr), "+c" (_cnt), "+d" (_port) :: + "%eax", "memory", "cc"); +} + +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) +{ + int _cnt = cnt; + void *_addr = a; + int _port = h + o; + + __asm volatile("cld ;" + "1: inw %w2,%%ax ;" + " stosw ;" + " addl $2,%2 ;" + " loop 1b" : + "+D" (_addr), "+c" (_cnt), "+d" (_port) :: + "%eax", "memory", "cc"); +} + +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) +{ + int _cnt = cnt; + void *_addr = a; + int _port = h + o; + + __asm volatile("cld ;" + "1: inl %w2,%%eax ;" + " stosl ;" + " addl $4,%2 ;" + " loop 1b" : + "+D" (_addr), "+c" (_cnt), "+d" (_port) :: + "%eax", "memory", "cc"); +} + +void +i386_bus_space_io_write_1(bus_space_handle_t h, bus_size_t o, u_int8_t v) +{ + outb(h + o, v); +} + +void +i386_bus_space_io_write_2(bus_space_handle_t h, bus_size_t o, u_int16_t v) +{ + outw(h + o, v); +} + +void +i386_bus_space_io_write_4(bus_space_handle_t h, bus_size_t o, u_int32_t v) +{ + outl(h + o, v); +} + +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) +{ + outsb(h + o, a, cnt); +} + +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) +{ + outsw(h + o, a, cnt); +} + +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) +{ + outsl(h + o, a, cnt); +} + +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) +{ + int _port = h + o; + const void *_addr = a; + int _cnt = cnt; + + __asm volatile("cld ;" + "1: lodsb ;" + " outb %%al,%w0 ;" + " incl %0 ;" + " loop 1b" : + "+d" (_port), "+S" (_addr), "+c" (_cnt) :: + "%eax", "memory", "cc"); +} + +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) +{ + int _port = h + o; + const void *_addr = a; + int _cnt = cnt; + + __asm volatile("cld ;" + "1: lodsw ;" + " outw %%ax,%w0 ;" + " addl $2,%0 ;" + " loop 1b" : + "+d" (_port), "+S" (_addr), "+c" (_cnt) :: + "%eax", "memory", "cc"); +} + +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) +{ + int _port = h + o; + const void *_addr = a; + int _cnt = cnt; + + __asm volatile("cld ;" + "1: lodsl ;" + " outl %%eax,%w0 ;" + " addl $4,%0 ;" + " loop 1b" : + "+d" (_port), "+S" (_addr), "+c" (_cnt) :: + "%eax", "memory", "cc"); +} + +void +i386_bus_space_io_set_multi_1(bus_space_handle_t h, + bus_size_t o, u_int8_t v, size_t cnt) +{ + int _cnt = cnt; + + __asm volatile("cld ;" + "1: outb %b2, %w1 ;" + " loop 1b" : + "+c" (_cnt) : "d" (h + o), "a" (v) : + "cc"); +} + +void +i386_bus_space_io_set_multi_2(bus_space_handle_t h, + bus_size_t o, u_int16_t v, size_t cnt) +{ + int _cnt = cnt; + + __asm volatile("cld ;" + "1: outw %w2, %w1 ;" + " loop 1b" : + "+c" (_cnt) : "d" (h + o), "a" (v) : + "cc"); +} + +void +i386_bus_space_io_set_multi_4(bus_space_handle_t h, + bus_size_t o, u_int32_t v, size_t cnt) +{ + int _cnt = cnt; + + __asm volatile("cld ;" + "1: outl %2,%w1 ;" + " loop 1b" : + "+c" (_cnt) : "d" (h + o), "a" (v) : + "cc"); +} + +void +i386_bus_space_io_set_region_1(bus_space_handle_t h, + bus_size_t o, u_int8_t v, size_t cnt) +{ + int _port = h + o; + int _cnt = cnt; + + __asm volatile( + "1: outb %%al,%w0 ;" + " incl %0 ;" + " loop 1b" : + "+d" (_port), "+c" (_cnt) : "a" (v) : + "cc"); +} + +void +i386_bus_space_io_set_region_2(bus_space_handle_t h, + bus_size_t o, u_int16_t v, size_t cnt) +{ + int _port = h + o; + int _cnt = cnt; + + __asm volatile( + "1: outw %%ax,%w0 ;" + " addl $2, %0 ;" + " loop 1b" : + "+d" (_port), "+c" (_cnt) : "a" (v) : + "cc"); +} + +void +i386_bus_space_io_set_region_4(bus_space_handle_t h, + bus_size_t o, u_int32_t v, size_t cnt) +{ + int _port = h + o; + int _cnt = cnt; + + __asm volatile( + "1: outl %%eax,%w0 ;" + " addl $4, %0 ;" + " loop 1b" : + "+d" (_port), "+c" (_cnt) : "a" (v) : + "cc"); +} + +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) +{ + int _port1 = h1 + o1; + int _port2 = h2 + o2; + int _cnt = cnt; + + __asm volatile( + "1: movl %k1,%%edx ;" + " inb %%dx,%%al ;" + " movl %k0,%%edx ;" + " outb %%al,%%dx ;" + " incl %0 ;" + " incl %1 ;" + " loop 1b" : + "+D" (_port2), "+S" (_port1), "+c" (_cnt) :: + "%edx", "%eax", "cc"); +} + +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) +{ + int _port1 = h1 + o1; + int _port2 = h2 + o2; + int _cnt=cnt; + + __asm volatile( + "1: movl %k1,%%edx ;" + " inw %%dx,%%ax ;" + " movl %k0,%%edx ;" + " outw %%ax,%%dx ;" + " addl $2, %0 ;" + " addl $2, %1 ;" + " loop 1b" : + "+D" (_port2), "+S" (_port1), "+c" (_cnt) :: + "%edx", "%eax", "cc"); +} + +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) +{ + int _port1 = h1 + o1; + int _port2 = h2 + o2; + int _cnt = cnt; + + __asm volatile( + "1: movl %k1,%%edx ;" + " inl %%dx,%%eax ;" + " movl %k0,%%edx ;" + " outl %%eax,%%dx ;" + " addl $4, %0 ;" + " addl $4, %1 ;" + " loop 1b" : + "+D" (_port2), "+S" (_port1), "+c" (_cnt) :: + "%edx", "%eax", "cc"); +} + +void * +i386_bus_space_io_vaddr(bus_space_handle_t h) { - return ((t) == I386_BUS_SPACE_IO ? (inl((h) + (o))) : - (*(volatile u_int32_t *)((h) + (o)))); + return (NULL); } +paddr_t +i386_bus_space_io_mmap(bus_addr_t addr, off_t off, int prot, int flags) +{ + /* Can't mmap I/O space. */ + return (-1); +} + +u_int8_t +i386_bus_space_mem_read_1(bus_space_handle_t h, bus_size_t o) +{ + return (*(volatile u_int8_t *)((h) + (o))); +} + +u_int16_t +i386_bus_space_mem_read_2(bus_space_handle_t h, bus_size_t o) +{ + return (*(volatile u_int16_t *)((h) + (o))); +} + +u_int32_t +i386_bus_space_mem_read_4(bus_space_handle_t h, bus_size_t o) +{ + return (*(volatile u_int32_t *)((h) + (o))); +} void -bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, +i386_bus_space_mem_read_multi_1(bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t cnt) { - if (t == I386_BUS_SPACE_IO) { - insb(h + o, a, cnt); - } else { - void *_addr=a; - int _cnt=cnt; - __asm volatile("cld ;" - "1: movb (%2),%%al ;" - " stosb ;" - " loop 1b" : - "+D" (_addr), "+c" (_cnt) : "r" (h + o) : - "%eax", "memory", "cc"); - } + void *_addr=a; + int _cnt=cnt; + __asm volatile("cld ;" + "1: movb (%2),%%al ;" + " stosb ;" + " loop 1b" : + "+D" (_addr), "+c" (_cnt) : "r" (h + o) : + "%eax", "memory", "cc"); } void -bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, +i386_bus_space_mem_read_multi_2(bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t cnt) { - if (t == I386_BUS_SPACE_IO) { - insw(h + o, a, cnt); - } else { - void *_addr=a; - int _cnt=cnt; - __asm volatile("cld ;" - "1: movw (%2),%%ax ;" - " stosw ;" - " loop 1b" : - "+D" (_addr), "+c" (_cnt) : "r" ((h) + (o)) : - "%eax", "memory", "cc"); - } -} -void -bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, + void *_addr=a; + int _cnt=cnt; + __asm volatile("cld ;" + "1: movw (%2),%%ax ;" + " stosw ;" + " loop 1b" : + "+D" (_addr), "+c" (_cnt) : "r" ((h) + (o)) : + "%eax", "memory", "cc"); +} + +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) { - if (t == I386_BUS_SPACE_IO) { - insl(h + o, a, cnt); - } else { - void *_addr=a; - int _cnt=cnt; - __asm volatile("cld ;" - "1: movl (%2),%%eax ;" - " stosl ;" - " loop 1b" : - "+D" (_addr), "+c" (_cnt) : "r" (h + o) : - "%eax", "memory", "cc"); - } + void *_addr=a; + int _cnt=cnt; + __asm volatile("cld ;" + "1: movl (%2),%%eax ;" + " stosl ;" + " loop 1b" : + "+D" (_addr), "+c" (_cnt) : "r" (h + o) : + "%eax", "memory", "cc"); } void -bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, +i386_bus_space_mem_read_region_1(bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t cnt) { int _cnt = cnt; void *_addr = a; int _port = h + o; - if (t == I386_BUS_SPACE_IO) { - __asm volatile("cld ;" - "1: inb %w2,%%al ;" - " stosb ;" - " incl %2 ;" - " loop 1b" : - "+D" (_addr), "+c" (_cnt), "+d" (_port) :: - "%eax", "memory", "cc"); - } else - i386_space_copy(_port, _addr, 1, _cnt); + i386_space_copy(_port, _addr, 1, _cnt); } void -bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, +i386_bus_space_mem_read_region_2(bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t cnt) { int _cnt = cnt; void *_addr = a; int _port = h + o; - if (t == I386_BUS_SPACE_IO) { - __asm volatile("cld ;" - "1: inw %w2,%%ax ;" - " stosw ;" - " addl $2,%2 ;" - " loop 1b" : - "+D" (_addr), "+c" (_cnt), "+d" (_port) :: - "%eax", "memory", "cc"); - } else - i386_space_copy(_port, _addr, 2, _cnt); + i386_space_copy(_port, _addr, 2, _cnt); } void -bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, +i386_bus_space_mem_read_region_4(bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t cnt) { int _cnt = cnt; void *_addr = a; int _port = h + o; - if (t == I386_BUS_SPACE_IO) { - __asm volatile("cld ;" - "1: inl %w2,%%eax ;" - " stosl ;" - " addl $4,%2 ;" - " loop 1b" : - "+D" (_addr), "+c" (_cnt), "+d" (_port) :: - "%eax", "memory", "cc"); - } else - i386_space_copy(_port, _addr, 4, _cnt); + i386_space_copy(_port, _addr, 4, _cnt); } void -bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, u_int8_t v) +i386_bus_space_mem_write_1(bus_space_handle_t h, bus_size_t o, u_int8_t v) { - if (t == I386_BUS_SPACE_IO) - outb(h + o, v); - else - ((void)(*(volatile u_int8_t *)(h + o) = v)); + ((void)(*(volatile u_int8_t *)(h + o) = v)); } void -bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, u_int16_t v) +i386_bus_space_mem_write_2(bus_space_handle_t h, bus_size_t o, u_int16_t v) { - if ((t) == I386_BUS_SPACE_IO) - outw(h + o, v); - else - ((void)(*(volatile u_int16_t *)(h + o) = v)); + ((void)(*(volatile u_int16_t *)(h + o) = v)); } void -bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, u_int32_t v) +i386_bus_space_mem_write_4(bus_space_handle_t h, bus_size_t o, u_int32_t v) { - if ((t) == I386_BUS_SPACE_IO) - outl(h + o, v); - else - ((void)(*(volatile u_int32_t *)(h + o) = v)); + ((void)(*(volatile u_int32_t *)(h + o) = v)); } void -bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, +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) { - if (t == I386_BUS_SPACE_IO) { - outsb(h + o, a, cnt); - } else { - const void *_addr=a; - int _cnt=cnt; + const void *_addr=a; + int _cnt=cnt; - __asm volatile("cld ;" - "1: lodsb ;" - " movb %%al,(%2) ;" - " loop 1b" : - "+S" (_addr), "+c" (_cnt) : "r" (h + o) : - "%eax", "memory", "cc"); - } + __asm volatile("cld ;" + "1: lodsb ;" + " movb %%al,(%2) ;" + " loop 1b" : + "+S" (_addr), "+c" (_cnt) : "r" (h + o) : + "%eax", "memory", "cc"); } void -bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, +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) { - if (t == I386_BUS_SPACE_IO) { - outsw(h + o, a, cnt); - } else { - const void *_addr = a; - int _cnt = cnt; + const void *_addr = a; + int _cnt = cnt; - __asm volatile("cld ;" - "1: lodsw ;" - " movw %%ax,(%2) ;" - " loop 1b" : - "+S" (_addr), "+c" (_cnt) : "r" (h + o) : - "%eax", "memory", "cc"); - } + __asm volatile("cld ;" + "1: lodsw ;" + " movw %%ax,(%2) ;" + " loop 1b" : + "+S" (_addr), "+c" (_cnt) : "r" (h + o) : + "%eax", "memory", "cc"); } + void -bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, +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) { - if (t == I386_BUS_SPACE_IO) { - outsl(h + o, a, cnt); - } else { - const void *_addr=a; - int _cnt=cnt; + const void *_addr=a; + int _cnt=cnt; - __asm volatile("cld ;" - "1: lodsl ;" - " movl %%eax,(%2) ;" - " loop 1b" : - "+S" (_addr), "+c" (_cnt) : "r" (h + o) : - "%eax", "memory", "cc"); - } + __asm volatile("cld ;" + "1: lodsl ;" + " movl %%eax,(%2) ;" + " loop 1b" : + "+S" (_addr), "+c" (_cnt) : "r" (h + o) : + "%eax", "memory", "cc"); } void -bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, +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) { int _port = h + o; const void *_addr = a; int _cnt = cnt; - if (t == I386_BUS_SPACE_IO) { - __asm volatile("cld ;" - "1: lodsb ;" - " outb %%al,%w0 ;" - " incl %0 ;" - " loop 1b" : - "+d" (_port), "+S" (_addr), "+c" (_cnt) :: - "%eax", "memory", "cc"); - } else - i386_space_copy(_addr, _port, 1, _cnt); + i386_space_copy(_addr, _port, 1, _cnt); } void -bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, +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) { int _port = h + o; const void *_addr = a; int _cnt = cnt; - if (t == I386_BUS_SPACE_IO) { - __asm volatile("cld ;" - "1: lodsw ;" - " outw %%ax,%w0 ;" - " addl $2,%0 ;" - " loop 1b" : - "+d" (_port), "+S" (_addr), "+c" (_cnt) :: - "%eax", "memory", "cc"); - } else - i386_space_copy(_addr, _port, 2, _cnt); + i386_space_copy(_addr, _port, 2, _cnt); } void -bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, +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) { int _port = h + o; const void *_addr = a; int _cnt = cnt; - if (t == I386_BUS_SPACE_IO) { - __asm volatile("cld ;" - "1: lodsl ;" - " outl %%eax,%w0 ;" - " addl $4,%0 ;" - " loop 1b" : - "+d" (_port), "+S" (_addr), "+c" (_cnt) :: - "%eax", "memory", "cc"); - } else - i386_space_copy(_addr, _port, 4, _cnt); + i386_space_copy(_addr, _port, 4, _cnt); } void -bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, +i386_bus_space_mem_set_multi_1(bus_space_handle_t h, bus_size_t o, u_int8_t v, size_t cnt) { int _cnt = cnt; - if (t == I386_BUS_SPACE_IO) { - __asm volatile("cld ;" - "1: outb %b2, %w1 ;" - " loop 1b" : - "+c" (_cnt) : "d" (h + o), "a" (v) : - "cc"); - } else { - __asm volatile("cld ;" - "1: movb %b2, (%1) ;" - " loop 1b" : - "+c" (_cnt) : "D" (h + o), "a" (v) : - "cc", "memory"); - } + __asm volatile("cld ;" + "1: movb %b2, (%1) ;" + " loop 1b" : + "+c" (_cnt) : "D" (h + o), "a" (v) : + "cc", "memory"); } void -bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, +i386_bus_space_mem_set_multi_2(bus_space_handle_t h, bus_size_t o, u_int16_t v, size_t cnt) { int _cnt = cnt; - if (t == I386_BUS_SPACE_IO) { - __asm volatile("cld ;" - "1: outw %w2, %w1 ;" - " loop 1b" : - "+c" (_cnt) : "d" (h + o), "a" (v) : - "cc"); - } else { - __asm volatile("cld ;" - "1: movw %w2, (%1) ;" - " loop 1b" : - "+c" (_cnt) : "D" (h + o), "a" (v) : - "cc", "memory"); - } + __asm volatile("cld ;" + "1: movw %w2, (%1) ;" + " loop 1b" : + "+c" (_cnt) : "D" (h + o), "a" (v) : + "cc", "memory"); } void -bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, +i386_bus_space_mem_set_multi_4(bus_space_handle_t h, bus_size_t o, u_int32_t v, size_t cnt) { int _cnt = cnt; - if (t == I386_BUS_SPACE_IO) { - __asm volatile("cld ;" - "1: outl %2,%w1 ;" - " loop 1b" : - "+c" (_cnt) : "d" (h + o), "a" (v) : - "cc"); - } else { - __asm volatile("cld ;" - "1: movl %2,(%1) ;" - " loop 1b" : - "+c" (_cnt) : "D" (h + o), "a" (v) : - "cc", "memory"); - } + __asm volatile("cld ;" + "1: movl %2,(%1) ;" + " loop 1b" : + "+c" (_cnt) : "D" (h + o), "a" (v) : + "cc", "memory"); } void -bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, +i386_bus_space_mem_set_region_1(bus_space_handle_t h, bus_size_t o, u_int8_t v, size_t cnt) { int _port = h + o; int _cnt = cnt; - if (t == I386_BUS_SPACE_IO) { - __asm volatile( - "1: outb %%al,%w0 ;" - " incl %0 ;" - " loop 1b" : - "+d" (_port), "+c" (_cnt) : "a" (v) : - "cc"); - } else { - __asm volatile("cld ;" - " repne ;" - " stosb" : - "+D" (_port), "+c" (_cnt) : "a" (v) : - "memory", "cc"); - } + __asm volatile("cld ;" + " repne ;" + " stosb" : + "+D" (_port), "+c" (_cnt) : "a" (v) : + "memory", "cc"); } void -bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, +i386_bus_space_mem_set_region_2(bus_space_handle_t h, bus_size_t o, u_int16_t v, size_t cnt) { int _port = h + o; int _cnt = cnt; - if (t == I386_BUS_SPACE_IO) { - __asm volatile( - "1: outw %%ax,%w0 ;" - " addl $2, %0 ;" - " loop 1b" : - "+d" (_port), "+c" (_cnt) : "a" (v) : - "cc"); - } else { - __asm volatile("cld ;" - " repne ;" - " stosw" : - "+D" (_port), "+c" (_cnt) : "a" (v) : - "memory", "cc"); - } + __asm volatile("cld ;" + " repne ;" + " stosw" : + "+D" (_port), "+c" (_cnt) : "a" (v) : + "memory", "cc"); } void -bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, +i386_bus_space_mem_set_region_4(bus_space_handle_t h, bus_size_t o, u_int32_t v, size_t cnt) { int _port = h + o; int _cnt = cnt; - if (t == I386_BUS_SPACE_IO) { - __asm volatile( - "1: outl %%eax,%w0 ;" - " addl $4, %0 ;" - " loop 1b" : - "+d" (_port), "+c" (_cnt) : "a" (v) : - "cc"); - } else { - __asm volatile("cld ;" - " repne ;" - " stosl" : - "+D" (_port), "+c" (_cnt) : "a" (v) : - "memory", "cc"); - } + __asm volatile("cld ;" + " repne ;" + " stosl" : + "+D" (_port), "+c" (_cnt) : "a" (v) : + "memory", "cc"); } void -bus_space_copy_1(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, +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) { int _port1 = h1 + o1; int _port2 = h2 + o2; int _cnt = cnt; - if (t == I386_BUS_SPACE_IO) { - __asm volatile( - "1: movl %k1,%%edx ;" - " inb %%dx,%%al ;" - " movl %k0,%%edx ;" - " outb %%al,%%dx ;" - " incl %0 ;" - " incl %1 ;" - " loop 1b" : - "+D" (_port2), "+S" (_port1), "+c" (_cnt) :: - "%edx", "%eax", "cc"); - } else - i386_space_copy(_port1, _port2, 1, _cnt); + i386_space_copy(_port1, _port2, 1, _cnt); } void -bus_space_copy_2(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, +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) { int _port1 = h1 + o1; int _port2 = h2 + o2; int _cnt=cnt; - if (t == I386_BUS_SPACE_IO) { - __asm volatile( - "1: movl %k1,%%edx ;" - " inw %%dx,%%ax ;" - " movl %k0,%%edx ;" - " outw %%ax,%%dx ;" - " addl $2, %0 ;" - " addl $2, %1 ;" - " loop 1b" : - "+D" (_port2), "+S" (_port1), "+c" (_cnt) :: - "%edx", "%eax", "cc"); - } else - i386_space_copy(_port1, _port2, 2, _cnt); -} - -void -bus_space_copy_4(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, + + i386_space_copy(_port1, _port2, 2, _cnt); +} + +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) { int _port1 = h1 + o1; int _port2 = h2 + o2; int _cnt = cnt; - if (t == I386_BUS_SPACE_IO) { - __asm volatile( - "1: movl %k1,%%edx ;" - " inl %%dx,%%eax ;" - " movl %k0,%%edx ;" - " outl %%eax,%%dx ;" - " addl $4, %0 ;" - " addl $4, %1 ;" - " loop 1b" : - "+D" (_port2), "+S" (_port1), "+c" (_cnt) :: - "%edx", "%eax", "cc"); - } else - i386_space_copy(_port1, _port2, 4, _cnt); + i386_space_copy(_port1, _port2, 4, _cnt); +} + +void * +i386_bus_space_mem_vaddr(bus_space_handle_t h) +{ + return ((void *)h); +} + +paddr_t +i386_bus_space_mem_mmap(bus_addr_t addr, off_t off, int prot, int flags) +{ + /* + * "addr" is the base address of the device we're mapping. + * "off" is the offset into that device. + * + * Note we are called for each "page" in the device that + * the upper layers want to map. + */ + return (addr + off); } diff --git a/sys/arch/i386/i386/machdep.c b/sys/arch/i386/i386/machdep.c index 739614f811c..4c3c9faf28b 100644 --- a/sys/arch/i386/i386/machdep.c +++ b/sys/arch/i386/i386/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.551 2014/09/19 20:02:25 kettenis Exp $ */ +/* $OpenBSD: machdep.c,v 1.552 2014/10/17 01:46:26 dlg Exp $ */ /* $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $ */ /*- @@ -3574,18 +3574,13 @@ bus_space_map(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size, int flags, /* * Pick the appropriate extent map. */ - switch (t) { - case I386_BUS_SPACE_IO: + if (t == I386_BUS_SPACE_IO) { ex = ioport_ex; if (flags & BUS_SPACE_MAP_LINEAR) return (EINVAL); - break; - - case I386_BUS_SPACE_MEM: + } else if (t == I386_BUS_SPACE_MEM) { ex = iomem_ex; - break; - - default: + } else { panic("bus_space_map: bad bus space tag"); } @@ -3659,16 +3654,11 @@ bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart, bus_addr_t rend, /* * Pick the appropriate extent map. */ - switch (t) { - case I386_BUS_SPACE_IO: + if (t == I386_BUS_SPACE_IO) { ex = ioport_ex; - break; - - case I386_BUS_SPACE_MEM: + } else if (t == I386_BUS_SPACE_MEM) { ex = iomem_ex; - break; - - default: + } else { panic("bus_space_alloc: bad bus space tag"); } diff --git a/sys/arch/i386/include/bus.h b/sys/arch/i386/include/bus.h index 891a2c23a77..9e0ba199e98 100644 --- a/sys/arch/i386/include/bus.h +++ b/sys/arch/i386/include/bus.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bus.h,v 1.61 2014/03/29 18:09:29 guenther Exp $ */ +/* $OpenBSD: bus.h,v 1.62 2014/10/17 01:46:26 dlg Exp $ */ /* $NetBSD: bus.h,v 1.6 1996/11/10 03:19:25 thorpej Exp $ */ /*- @@ -72,12 +72,6 @@ #include <machine/pio.h> /* - * Values for the i386 bus space tag, not to be used directly by MI code. - */ -#define I386_BUS_SPACE_IO 0 /* space is i/o space */ -#define I386_BUS_SPACE_MEM 1 /* space is mem space */ - -/* * Bus address and size types */ typedef u_long bus_addr_t; @@ -86,7 +80,8 @@ typedef u_long bus_size_t; /* * Access methods for bus resources and address space. */ -typedef int bus_space_tag_t; +struct i386_bus_space_ops; +typedef const struct i386_bus_space_ops *bus_space_tag_t; typedef u_long bus_space_handle_t; int bus_space_map(bus_space_tag_t t, bus_addr_t addr, @@ -110,6 +105,8 @@ int bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart, void bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size); +struct i386_bus_space_ops { + /* * u_intN_t bus_space_read_N(bus_space_tag_t tag, * bus_space_handle_t bsh, bus_size_t offset); @@ -117,14 +114,13 @@ void bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh, * Read a 1, 2, 4, or 8 byte quantity from bus space * described by tag/handle/offset. */ -u_int8_t bus_space_read_1(bus_space_tag_t, bus_space_handle_t, - bus_size_t); + u_int8_t (*read_1)(bus_space_handle_t, bus_size_t); + u_int16_t (*read_2)(bus_space_handle_t, bus_size_t); + u_int32_t (*read_4)(bus_space_handle_t, bus_size_t); -u_int16_t bus_space_read_2(bus_space_tag_t, bus_space_handle_t, - bus_size_t); - -u_int32_t bus_space_read_4(bus_space_tag_t, bus_space_handle_t, - bus_size_t); +#define bus_space_read_1(_t, _h, _o) ((_t)->read_1((_h), (_o))) +#define bus_space_read_2(_t, _h, _o) ((_t)->read_2((_h), (_o))) +#define bus_space_read_4(_t, _h, _o) ((_t)->read_4((_h), (_o))) #define bus_space_read_raw_2(t, h, o) \ bus_space_read_2((t), (h), (o)) @@ -146,17 +142,19 @@ u_int32_t bus_space_read_4(bus_space_tag_t, bus_space_handle_t, * described by tag/handle/offset and copy into buffer provided. */ -#define bus_space_read_raw_multi_2(t, h, o, a, c) \ - bus_space_read_multi_2((t), (h), (o), (u_int16_t *)(a), (c) >> 1) -#define bus_space_read_raw_multi_4(t, h, o, a, c) \ - bus_space_read_multi_4((t), (h), (o), (u_int32_t *)(a), (c) >> 2) + void (*read_multi_1)(bus_space_handle_t, bus_size_t, + u_int8_t *, bus_size_t); + void (*read_multi_2)(bus_space_handle_t, bus_size_t, + u_int16_t *, bus_size_t); + void (*read_multi_4)(bus_space_handle_t, bus_size_t, + u_int32_t *, bus_size_t); -void bus_space_read_multi_1(bus_space_tag_t, bus_space_handle_t, bus_size_t, - u_int8_t *, bus_size_t); -void bus_space_read_multi_2(bus_space_tag_t, bus_space_handle_t, bus_size_t, - u_int16_t *, bus_size_t); -void bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, - u_int32_t *, bus_size_t); +#define bus_space_read_multi_1(_t, _h, _o, _a, _c) \ + ((_t)->read_multi_1((_h), (_o), (_a), (_c))) +#define bus_space_read_multi_2(_t, _h, _o, _a, _c) \ + ((_t)->read_multi_2((_h), (_o), (_a), (_c))) +#define bus_space_read_multi_4(_t, _h, _o, _a, _c) \ + ((_t)->read_multi_4((_h), (_o), (_a), (_c))) #if 0 /* Cause a link error for bus_space_read_multi_8 */ #define bus_space_read_multi_8 !!! bus_space_read_multi_8 unimplemented !!! @@ -193,12 +191,19 @@ void bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, * buffer provided. */ -void bus_space_read_region_1(bus_space_tag_t, bus_space_handle_t, - bus_size_t, u_int8_t *, bus_size_t); -void bus_space_read_region_2(bus_space_tag_t, bus_space_handle_t, - bus_size_t, u_int16_t *, bus_size_t); -void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t, - bus_size_t, u_int32_t *, bus_size_t); + void (*read_region_1)(bus_space_handle_t, + bus_size_t, u_int8_t *, bus_size_t); + void (*read_region_2)(bus_space_handle_t, + bus_size_t, u_int16_t *, bus_size_t); + void (*read_region_4)(bus_space_handle_t, + bus_size_t, u_int32_t *, bus_size_t); + +#define bus_space_read_region_1(_t, _h, _o, _a, _c) \ + ((_t)->read_region_1((_h), (_o), (_a), (_c))) +#define bus_space_read_region_2(_t, _h, _o, _a, _c) \ + ((_t)->read_region_2((_h), (_o), (_a), (_c))) +#define bus_space_read_region_4(_t, _h, _o, _a, _c) \ + ((_t)->read_region_4((_h), (_o), (_a), (_c))) #if 0 /* Cause a link error for bus_space_read_region_8 */ #define bus_space_read_region_8 !!! bus_space_read_region_8 unimplemented !!! @@ -216,10 +221,10 @@ void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t, * these functions. */ -#define bus_space_read_raw_region_2(t, h, o, a, c) \ - bus_space_read_region_2((t), (h), (o), (u_int16_t *)(a), (c) >> 1) -#define bus_space_read_raw_region_4(t, h, o, a, c) \ - bus_space_read_region_4((t), (h), (o), (u_int32_t *)(a), (c) >> 2) +#define bus_space_read_raw_region_2(_t, _h, _o, _a, _c) \ + ((_t)->read_region_2((_h), (_o), (u_int16_t *)(_a), (_c) >> 1)) +#define bus_space_read_raw_region_4(_t, _h, _o, _a, _c) \ + ((_t)->read_region_4((_h), (_o), (u_int32_t *)(_a), (_c) >> 2)) #if 0 /* Cause a link error for bus_space_read_raw_region_8 */ #define bus_space_read_raw_region_8 \ @@ -235,12 +240,16 @@ void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t, * described by tag/handle/offset. */ -void bus_space_write_1(bus_space_tag_t, bus_space_handle_t, - bus_size_t, u_int8_t); -void bus_space_write_2(bus_space_tag_t, bus_space_handle_t, - bus_size_t, u_int16_t); -void bus_space_write_4(bus_space_tag_t, bus_space_handle_t, - bus_size_t, u_int32_t); + void (*write_1)(bus_space_handle_t, bus_size_t, u_int8_t); + void (*write_2)(bus_space_handle_t, bus_size_t, u_int16_t); + void (*write_4)(bus_space_handle_t, bus_size_t, u_int32_t); + +#define bus_space_write_1(_t, _h, _o, _v) \ + ((_t)->write_1((_h), (_o), (_v))) +#define bus_space_write_2(_t, _h, _o, _v) \ + ((_t)->write_2((_h), (_o), (_v))) +#define bus_space_write_4(_t, _h, _o, _v) \ + ((_t)->write_4((_h), (_o), (_v))) #define bus_space_write_raw_2(t, h, o, v) \ bus_space_write_2((t), (h), (o), (v)) @@ -262,12 +271,19 @@ void bus_space_write_4(bus_space_tag_t, bus_space_handle_t, * provided to bus space described by tag/handle/offset. */ -void bus_space_write_multi_1(bus_space_tag_t, bus_space_handle_t, - bus_size_t, const u_int8_t *, bus_size_t); -void bus_space_write_multi_2(bus_space_tag_t, bus_space_handle_t, - bus_size_t, const u_int16_t *, bus_size_t); -void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t, - bus_size_t, const u_int32_t *, bus_size_t); + void (*write_multi_1)(bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); + void (*write_multi_2)(bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); + void (*write_multi_4)(bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); + +#define bus_space_write_multi_1(_t, _h, _o, _a, _c) \ + ((_t)->write_multi_1((_h), (_o), (_a), (_c))) +#define bus_space_write_multi_2(_t, _h, _o, _a, _c) \ + ((_t)->write_multi_2((_h), (_o), (_a), (_c))) +#define bus_space_write_multi_4(_t, _h, _o, _a, _c) \ + ((_t)->write_multi_4((_h), (_o), (_a), (_c))) #if 0 /* Cause a link error for bus_space_write_multi_8 */ #define bus_space_write_multi_8(t, h, o, a, c) \ @@ -285,10 +301,10 @@ void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t, * possible byte-swapping should be done by these functions. */ -#define bus_space_write_raw_multi_2(t, h, o, a, c) \ - bus_space_write_multi_2((t), (h), (o), (const u_int16_t *)(a), (c) >> 1) -#define bus_space_write_raw_multi_4(t, h, o, a, c) \ - bus_space_write_multi_4((t), (h), (o), (const u_int32_t *)(a), (c) >> 2) +#define bus_space_write_raw_multi_2(_t, _h, _o, _a, _c) \ + ((_t)->write_multi_2((_h), (_o), (const u_int16_t *)(_a), (_c) >> 1)) +#define bus_space_write_raw_multi_4(_t, _h, _o, _a, _c) \ + ((_t)->write_multi_4((_h), (_o), (const u_int32_t *)(_a), (_c) >> 2)) #if 0 /* Cause a link error for bus_space_write_raw_multi_8 */ #define bus_space_write_raw_multi_8 \ @@ -304,12 +320,19 @@ void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t, * to bus space described by tag/handle starting at `offset'. */ -void bus_space_write_region_1(bus_space_tag_t, bus_space_handle_t, - bus_size_t, const u_int8_t *, bus_size_t); -void bus_space_write_region_2(bus_space_tag_t, bus_space_handle_t, - bus_size_t, const u_int16_t *, bus_size_t); -void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t, - bus_size_t, const u_int32_t *, bus_size_t); + void (*write_region_1)(bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); + void (*write_region_2)(bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); + void (*write_region_4)(bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); + +#define bus_space_write_region_1(_t, _h, _o, _a, _c) \ + ((_t)->write_region_1((_h), (_o), (_a), (_c))) +#define bus_space_write_region_2(_t, _h, _o, _a, _c) \ + ((_t)->write_region_2((_h), (_o), (_a), (_c))) +#define bus_space_write_region_4(_t, _h, _o, _a, _c) \ + ((_t)->write_region_4((_h), (_o), (_a), (_c))) #if 0 /* Cause a link error for bus_space_write_region_8 */ #define bus_space_write_region_8 \ @@ -328,10 +351,10 @@ void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t, * these functions. */ -#define bus_space_write_raw_region_2(t, h, o, a, c) \ - bus_space_write_region_2((t), (h), (o), (const u_int16_t *)(a), (c) >> 1) -#define bus_space_write_raw_region_4(t, h, o, a, c) \ - bus_space_write_region_4((t), (h), (o), (const u_int32_t *)(a), (c) >> 2) +#define bus_space_write_raw_region_2(_t, _h, _o, _a, _c) \ + ((_t)->write_region_2((_h), (_o), (const u_int16_t *)(_a), (_c) >> 1)) +#define bus_space_write_raw_region_4(_t, _h, _o, _a, _c) \ + ((_t)->write_region_4((_h), (_o), (const u_int32_t *)(_a), (_c) >> 2)) #if 0 /* Cause a link error for bus_space_write_raw_region_8 */ #define bus_space_write_raw_region_8 \ @@ -347,12 +370,19 @@ void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t, * by tag/handle/offset `count' times. */ -void bus_space_set_multi_1(bus_space_tag_t, bus_space_handle_t, - bus_size_t, u_int8_t, size_t); -void bus_space_set_multi_2(bus_space_tag_t, bus_space_handle_t, - bus_size_t, u_int16_t, size_t); -void bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t, - bus_size_t, u_int32_t, size_t); + void (*set_multi_1)(bus_space_handle_t, + bus_size_t, u_int8_t, size_t); + void (*set_multi_2)(bus_space_handle_t, + bus_size_t, u_int16_t, size_t); + void (*set_multi_4)(bus_space_handle_t, + bus_size_t, u_int32_t, size_t); + +#define bus_space_set_multi_1(_t, _h, _o, _a, _c) \ + ((_t)->set_multi_1((_h), (_o), (_a), (_c))) +#define bus_space_set_multi_2(_t, _h, _o, _a, _c) \ + ((_t)->set_multi_2((_h), (_o), (_a), (_c))) +#define bus_space_set_multi_4(_t, _h, _o, _a, _c) \ + ((_t)->set_multi_4((_h), (_o), (_a), (_c))) #if 0 /* Cause a link error for bus_space_set_multi_8 */ #define bus_space_set_multi_8 \ @@ -367,13 +397,20 @@ void bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t, * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described * by tag/handle starting at `offset'. */ -void bus_space_set_region_1(bus_space_tag_t, bus_space_handle_t, - bus_size_t, u_int8_t, size_t); -void bus_space_set_region_2(bus_space_tag_t, bus_space_handle_t, - bus_size_t, u_int16_t, size_t); -void bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t, - bus_size_t, u_int32_t, size_t); + void (*set_region_1)(bus_space_handle_t, + bus_size_t, u_int8_t, size_t); + void (*set_region_2)(bus_space_handle_t, + bus_size_t, u_int16_t, size_t); + void (*set_region_4)(bus_space_handle_t, + bus_size_t, u_int32_t, size_t); + +#define bus_space_set_region_1(_t, _h, _o, _a, _c) \ + ((_t)->set_region_1((_h), (_o), (_a), (_c))) +#define bus_space_set_region_2(_t, _h, _o, _a, _c) \ + ((_t)->set_region_2((_h), (_o), (_a), (_c))) +#define bus_space_set_region_4(_t, _h, _o, _a, _c) \ + ((_t)->set_region_4((_h), (_o), (_a), (_c))) #if 0 /* Cause a link error for bus_space_set_region_8 */ #define bus_space_set_region_8 \ @@ -390,12 +427,19 @@ void bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t, * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. */ -void bus_space_copy_1(bus_space_tag_t, bus_space_handle_t, bus_size_t, - bus_space_handle_t, bus_size_t, bus_size_t); -void bus_space_copy_2(bus_space_tag_t, bus_space_handle_t, bus_size_t, - bus_space_handle_t, bus_size_t, bus_size_t); -void bus_space_copy_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, - bus_space_handle_t, bus_size_t, bus_size_t); + void (*copy_1)(bus_space_handle_t, + bus_size_t, bus_space_handle_t, bus_size_t, size_t); + void (*copy_2)(bus_space_handle_t, + bus_size_t, bus_space_handle_t, bus_size_t, size_t); + void (*copy_4)(bus_space_handle_t, + bus_size_t, bus_space_handle_t, bus_size_t, size_t); + +#define bus_space_copy_1(_t, _h1, _o1, _h2, _o2, _c) \ + ((_t)->copy_1((_h1), (_o1), (_h2), (_o2), (_c))) +#define bus_space_copy_2(_t, _h1, _o1, _h2, _o2, _c) \ + ((_t)->copy_2((_h1), (_o1), (_h2), (_o2), (_c))) +#define bus_space_copy_4(_t, _h1, _o1, _h2, _o2, _c) \ + ((_t)->copy_4((_h1), (_o1), (_h2), (_o2), (_c))) #if 0 /* Cause a link error for bus_space_copy_8 */ #define bus_space_copy_8 \ @@ -423,6 +467,18 @@ void bus_space_copy_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, } while (0) /* + * void *bus_space_vaddr(bus_space_tag_t, bus_space_handle_t); + * + * Get the kernel virtual address for the mapped bus space. + * Only allowed for regions mapped with BUS_SPACE_MAP_LINEAR. + */ + void * (*vaddr)(bus_space_handle_t); + +#define bus_space_vaddr(_t, _h) \ + ((_t)->vaddr((_h))) +}; + +/* * Bus read/write barrier methods. * * void bus_space_barrier(bus_space_tag_t tag, @@ -444,13 +500,16 @@ void bus_space_copy_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, #define BUS_SPACE_MAP_PREFETCHABLE 0x0008 /* - * void *bus_space_vaddr(bus_space_tag_t, bus_space_handle_t); - * - * Get the kernel virtual address for the mapped bus space. - * Only allowed for regions mapped with BUS_SPACE_MAP_LINEAR. + * Values for the i386 bus space tag, not to be used directly by MI code. */ -#define bus_space_vaddr(t, h) \ - ((t) == I386_BUS_SPACE_IO ? (void *)(NULL) : (void *)(h)) + +/* space is i/o space */ +extern const struct i386_bus_space_ops i386_bus_space_io_ops; +#define I386_BUS_SPACE_IO (&i386_bus_space_io_ops) + +/* space is mem space */ +extern const struct i386_bus_space_ops i386_bus_space_mem_ops; +#define I386_BUS_SPACE_MEM (&i386_bus_space_mem_ops) /* * Flags used in various bus DMA methods. |