Oops, I forget to include patches.
KATO Takenori <[EMAIL PROTECTED]> wrote:
> Attached patches provides indirection support in bus space stuff
> (submitted by Takahashi-san <[EMAIL PROTECTED]> with minor modification
> by me).
>
> I <[EMAIL PROTECTED]> wrote:
>
> > 3. Make new sys/i386/include/bus.h file as:
> > #ifdef PC98
> > #include <machine/bus_pc98.h>
> > #else
> > #include <machine/bsu_at386.h>
> > #endif
>
> Only one #ifdef in the diff makes it needless. In this patch,
> indirection is enabled by default in PC-98 kernel and is disabled by
> default in IBM-PC kernel. That is, there is no performance loss in
> IBM-PC kernel.
>
> Any comment?
>
>
> Thanks.
-----------------------------------------------+--------------------------+
KATO Takenori <[EMAIL PROTECTED]> | FreeBSD |
Dept. Earth Planet. Sci, Nagoya Univ. | The power to serve! |
Nagoya, 464-8602, Japan | http://www.FreeBSD.org/ |
|http://www.jp.FreeBSD.org/|
++++ FreeBSD(98) 3.3R-Rev. 01 available! +==========================+
--- bus.h.orig Sat Dec 25 13:06:10 1999
+++ bus.h Sat Dec 25 13:21:41 1999
@@ -72,14 +72,18 @@
#ifndef _I386_BUS_H_
#define _I386_BUS_H_
+#include <sys/bus.h>
#include <machine/cpufunc.h>
/*
- * To remain compatible with NetBSD's interface, default to both memio and
- * pio when neither of them is defined.
+ * To remain compatible with NetBSD's interface, default to memio, pio and
+ * pio-indirection (PC-98 only) when neither of them is defined.
*/
-#if !defined(_I386_BUS_PIO_H_) && !defined(_I386_BUS_MEMIO_H_)
+#if !defined(_I386_BUS_PIO_H_) && !defined(_I386_BUS_PIO_IND_H_) &&
+!defined(_I386_BUS_MEMIO_H_)
#define _I386_BUS_PIO_H_
+#ifdef PC98
+#define _I386_BUS_PIO_IND_H_
+#endif
#define _I386_BUS_MEMIO_H_
#endif
@@ -88,6 +92,7 @@
*/
#define I386_BUS_SPACE_IO 0 /* space is i/o space */
#define I386_BUS_SPACE_MEM 1 /* space is mem space */
+#define I386_BUS_SPACE_IO_IND 2 /* space is i/o space */
/*
* Bus address and size types
@@ -107,8 +112,25 @@
/*
* Access methods for bus resources and address space.
*/
+struct resource;
+
typedef int bus_space_tag_t;
-typedef u_int bus_space_handle_t;
+typedef struct {
+ bus_addr_t bsh_base;
+ bus_addr_t *bsh_iat;
+ size_t bsh_iatsz;
+ struct resource **bsh_res;
+ size_t bsh_ressz;
+} bus_space_handle_t;
+
+/*
+ * Allocate discontinuous resources for ISA bus.
+ */
+struct resource *
+isa_alloc_resourcev(device_t child, int type, int *rid,
+ bus_addr_t *res, bus_size_t count, u_int flags);
+int
+isa_load_resourcev(struct resource *re, bus_addr_t *res, bus_size_t count);
/*
* Map a region of device bus space into CPU virtual address space.
@@ -151,7 +173,7 @@
void bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh,
bus_size_t size);
-#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_) ||
+defined(_I386_BUS_MEMIO_H_)
/*
* Read a 1, 2, 4, or 8 byte quantity from bus space
@@ -170,47 +192,74 @@
bus_size_t offset);
static __inline u_int8_t
-bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle,
+bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t bsh,
bus_size_t offset)
{
-#if defined (_I386_BUS_PIO_H_)
-#if defined (_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
- return (inb(handle + offset));
+ return (inb(bsh.bsh_base + offset));
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ return (inb(bsh.bsh_iat[offset]));
#endif
-#if defined (_I386_BUS_MEMIO_H_)
- return (*(volatile u_int8_t *)(handle + offset));
+#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ else
+#endif
+ return (*(volatile u_int8_t *)(bsh.bsh_base + offset));
#endif
}
static __inline u_int16_t
-bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t handle,
+bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t bsh,
bus_size_t offset)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
- return (inw(handle + offset));
+ return (inw(bsh.bsh_base + offset));
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ return (inw(bsh.bsh_iat[offset]));
#endif
#if defined(_I386_BUS_MEMIO_H_)
- return (*(volatile u_int16_t *)(handle + offset));
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ else
+#endif
+ return (*(volatile u_int16_t *)(bsh.bsh_base + offset));
#endif
}
static __inline u_int32_t
-bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t handle,
+bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t bsh,
bus_size_t offset)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
- return (inl(handle + offset));
+ return (inl(bsh.bsh_base + offset));
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ return (inl(bsh.bsh_iat[offset]));
#endif
#if defined(_I386_BUS_MEMIO_H_)
- return (*(volatile u_int32_t *)(handle + offset));
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ else
+#endif
+ return (*(volatile u_int32_t *)(bsh.bsh_base + offset));
#endif
}
@@ -242,14 +291,20 @@
bus_size_t offset, u_int8_t *addr, size_t count)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
- insb(bsh + offset, addr, count);
+ insb(bsh.bsh_base + offset, addr, count);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ insb(bsh.bsh_iat[offset], addr, count);
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
__asm __volatile(" \n\
@@ -258,7 +313,7 @@
stosb \n\
loop 1b" :
"=D" (addr), "=c" (count) :
- "r" (bsh + offset), "0" (addr), "1" (count) :
+ "r" (bsh.bsh_base + offset), "0" (addr), "1" (count) :
"%eax", "memory");
}
#endif
@@ -269,14 +324,20 @@
bus_size_t offset, u_int16_t *addr, size_t count)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
- insw(bsh + offset, addr, count);
+ insw(bsh.bsh_base + offset, addr, count);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ insw(bsh.bsh_iat[offset], addr, count);
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
__asm __volatile(" \n\
@@ -285,7 +346,7 @@
stosw \n\
loop 1b" :
"=D" (addr), "=c" (count) :
- "r" (bsh + offset), "0" (addr), "1" (count) :
+ "r" (bsh.bsh_base + offset), "0" (addr), "1" (count) :
"%eax", "memory");
}
#endif
@@ -296,14 +357,20 @@
bus_size_t offset, u_int32_t *addr, size_t count)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
- insl(bsh + offset, addr, count);
+ insl(bsh.bsh_base + offset, addr, count);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ insl(bsh.bsh_iat[offset], addr, count);
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
__asm __volatile(" \n\
@@ -312,7 +379,7 @@
stosl \n\
loop 1b" :
"=D" (addr), "=c" (count) :
- "r" (bsh + offset), "0" (addr), "1" (count) :
+ "r" (bsh.bsh_base + offset), "0" (addr), "1" (count) :
"%eax", "memory");
}
#endif
@@ -348,11 +415,11 @@
bus_size_t offset, u_int8_t *addr, size_t count)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
{
- int _port_ = bsh + offset; \
+ int _port_ = bsh.bsh_base + offset; \
__asm __volatile(" \n\
cld \n\
1: inb %w2,%%al \n\
@@ -364,12 +431,29 @@
"%eax", "memory", "cc");
}
#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ __asm __volatile(" \n\
+ cld \n\
+ 1: movl bsh.bsh_iat(%l2), %%edx \n\
+ inb %%dx,%%al \n\
+ stosb \n\
+ incl %2 \n\
+ loop 1b" :
+ "=D" (addr), "=c" (count), "=b" (offset) :
+ "0" (addr), "1" (count), "2" (offset) :
+ "%eax", "memory", "cc");
+ }
+#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
- int _port_ = bsh + offset; \
+ int _port_ = bsh.bsh_base + offset; \
__asm __volatile(" \n\
cld \n\
repne \n\
@@ -386,11 +470,11 @@
bus_size_t offset, u_int16_t *addr, size_t count)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
{
- int _port_ = bsh + offset; \
+ int _port_ = bsh.bsh_base + offset; \
__asm __volatile(" \n\
cld \n\
1: inw %w2,%%ax \n\
@@ -402,12 +486,29 @@
"%eax", "memory", "cc");
}
#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ __asm __volatile(" \n\
+ cld \n\
+ 1: movl bsh.bsh_iat(%l2), %%edx \n\
+ inw %%dx,%%ax \n\
+ stosw \n\
+ addl $2,%2 \n\
+ loop 1b" :
+ "=D" (addr), "=c" (count), "=b" (offset) :
+ "0" (addr), "1" (count), "2" (offset) :
+ "%eax", "memory", "cc");
+ }
+#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
- int _port_ = bsh + offset; \
+ int _port_ = bsh.bsh_base + offset; \
__asm __volatile(" \n\
cld \n\
repne \n\
@@ -424,11 +525,11 @@
bus_size_t offset, u_int32_t *addr, size_t count)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
{
- int _port_ = bsh + offset; \
+ int _port_ = bsh.bsh_base + offset; \
__asm __volatile(" \n\
cld \n\
1: inl %w2,%%eax \n\
@@ -440,12 +541,29 @@
"%eax", "memory", "cc");
}
#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ __asm __volatile(" \n\
+ cld \n\
+ 1: movl bsh.bsh_iat(%l2), %%edx \n\
+ inl %%dx,%%eax \n\
+ stosl \n\
+ addl $4,%2 \n\
+ loop 1b" :
+ "=D" (addr), "=c" (count), "=b" (offset) :
+ "0" (addr), "1" (count), "2" (offset) :
+ "%eax", "memory", "cc");
+ }
+#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
- int _port_ = bsh + offset; \
+ int _port_ = bsh.bsh_base + offset; \
__asm __volatile(" \n\
cld \n\
repne \n\
@@ -483,16 +601,22 @@
bus_size_t offset, u_int8_t value)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
- outb(bsh + offset, value);
+ outb(bsh.bsh_base + offset, value);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ outb(bsh.bsh_iat[offset], value);
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
- *(volatile u_int8_t *)(bsh + offset) = value;
+ *(volatile u_int8_t *)(bsh.bsh_base + offset) = value;
#endif
}
@@ -501,16 +625,22 @@
bus_size_t offset, u_int16_t value)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
- outw(bsh + offset, value);
+ outw(bsh.bsh_base + offset, value);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ outw(bsh.bsh_iat[offset], value);
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
- *(volatile u_int16_t *)(bsh + offset) = value;
+ *(volatile u_int16_t *)(bsh.bsh_base + offset) = value;
#endif
}
@@ -519,16 +649,22 @@
bus_size_t offset, u_int32_t value)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
- outl(bsh + offset, value);
+ outl(bsh.bsh_base + offset, value);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ outl(bsh.bsh_iat[offset], value);
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
- *(volatile u_int32_t *)(bsh + offset) = value;
+ *(volatile u_int32_t *)(bsh.bsh_base + offset) = value;
#endif
}
@@ -563,14 +699,20 @@
bus_size_t offset, const u_int8_t *addr, size_t count)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
- outsb(bsh + offset, addr, count);
+ outsb(bsh.bsh_base + offset, addr, count);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ outsb(bsh.bsh_iat[offset], addr, count);
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
__asm __volatile(" \n\
@@ -579,7 +721,7 @@
movb %%al,(%2) \n\
loop 1b" :
"=S" (addr), "=c" (count) :
- "r" (bsh + offset), "0" (addr), "1" (count) :
+ "r" (bsh.bsh_base + offset), "0" (addr), "1" (count) :
"%eax", "memory", "cc");
}
#endif
@@ -590,14 +732,20 @@
bus_size_t offset, const u_int16_t *addr, size_t count)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
- outsw(bsh + offset, addr, count);
+ outsw(bsh.bsh_base + offset, addr, count);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ outsw(bsh.bsh_iat[offset], addr, count);
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
__asm __volatile(" \n\
@@ -607,7 +755,7 @@
movw %%ax,(%2) \n\
loop 1b" :
"=S" (addr), "=c" (count) :
- "r" (bsh + offset), "0" (addr), "1" (count) :
+ "r" (bsh.bsh_base + offset), "0" (addr), "1" (count) :
"%eax", "memory", "cc");
}
#endif
@@ -618,14 +766,20 @@
bus_size_t offset, const u_int32_t *addr, size_t count)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
- outsl(bsh + offset, addr, count);
+ outsl(bsh.bsh_base + offset, addr, count);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ outsl(bsh.bsh_iat[offset], addr, count);
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
__asm __volatile(" \n\
@@ -634,7 +788,7 @@
movl %%eax,(%2) \n\
loop 1b" :
"=S" (addr), "=c" (count) :
- "r" (bsh + offset), "0" (addr), "1" (count) :
+ "r" (bsh.bsh_base + offset), "0" (addr), "1" (count) :
"%eax", "memory", "cc");
}
#endif
@@ -671,11 +825,11 @@
bus_size_t offset, const u_int8_t *addr, size_t count)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
{
- int _port_ = bsh + offset; \
+ int _port_ = bsh.bsh_base + offset; \
__asm __volatile(" \n\
cld \n\
1: lodsb \n\
@@ -687,12 +841,29 @@
"%eax", "memory", "cc");
}
#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ __asm __volatile(" \n\
+ cld \n\
+ 1: lodsb \n\
+ movl bsh.bsh_iat(%l0), %%edx \n\
+ outb %%al,%%dx \n\
+ incl %0 \n\
+ loop 1b" :
+ "=b" (offset), "=S" (addr), "=c" (count) :
+ "0" (offset), "1" (addr), "2" (count) :
+ "%eax", "memory", "cc");
+ }
+#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
- int _port_ = bsh + offset; \
+ int _port_ = bsh.bsh_base + offset; \
__asm __volatile(" \n\
cld \n\
repne \n\
@@ -709,11 +880,11 @@
bus_size_t offset, const u_int16_t *addr, size_t count)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
{
- int _port_ = bsh + offset; \
+ int _port_ = bsh.bsh_base + offset; \
__asm __volatile(" \n\
cld \n\
1: lodsw \n\
@@ -725,12 +896,29 @@
"%eax", "memory", "cc");
}
#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ __asm __volatile(" \n\
+ cld \n\
+ 1: lodsw \n\
+ movl bsh.bsh_iat(%l0), %%edx \n\
+ outw %%ax,%%dx \n\
+ addl $2,%0 \n\
+ loop 1b" :
+ "=b" (offset), "=S" (addr), "=c" (count) :
+ "0" (offset), "1" (addr), "2" (count) :
+ "%eax", "memory", "cc");
+ }
+#endif
#if defined(_I386_BUS_MEMIO_H_)
#if defined(_I386_BUS_PIO_H_)
- else
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
- int _port_ = bsh + offset; \
+ int _port_ = bsh.bsh_base + offset; \
__asm __volatile(" \n\
cld \n\
repne \n\
@@ -747,11 +935,11 @@
bus_size_t offset, const u_int32_t *addr, size_t count)
{
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
{
- int _port_ = bsh + offset; \
+ int _port_ = bsh.bsh_base + offset; \
__asm __volatile(" \n\
cld \n\
1: lodsl \n\
@@ -763,12 +951,29 @@
"%eax", "memory", "cc");
}
#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ __asm __volatile(" \n\
+ cld \n\
+ 1: lodsl \n\
+ movl bsh.bsh_iat(%l0), %%edx \n\
+ outl %%eax,%%dx \n\
+ addl $4,%0 \n\
+ loop 1b" :
+ "=b" (offset), "=S" (addr), "=c" (count) :
+ "0" (offset), "1" (addr), "2" (count) :
+ "%eax", "memory", "cc");
+ }
+#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
- int _port_ = bsh + offset; \
+ int _port_ = bsh.bsh_base + offset; \
__asm __volatile(" \n\
cld \n\
repne \n\
@@ -807,21 +1012,35 @@
bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh,
bus_size_t offset, u_int8_t value, size_t count)
{
- bus_addr_t addr = bsh + offset;
-
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
+ {
+ bus_addr_t addr = bsh.bsh_base + offset;
+ while (count--)
+ outb(addr, value);
+ }
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ bus_addr_t addr = bsh.bsh_iat[offset];
while (count--)
outb(addr, value);
+ }
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
+ {
+ bus_addr_t addr = bsh.bsh_base + offset;
while (count--)
*(volatile u_int8_t *)(addr) = value;
+ }
#endif
}
@@ -829,21 +1048,35 @@
bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh,
bus_size_t offset, u_int16_t value, size_t count)
{
- bus_addr_t addr = bsh + offset;
-
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
+ {
+ bus_addr_t addr = bsh.bsh_base + offset;
while (count--)
outw(addr, value);
+ }
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ bus_addr_t addr = bsh.bsh_iat[offset];
+ while (count--)
+ outw(addr, value);
+ }
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
+ {
+ bus_addr_t addr = bsh.bsh_base + offset;
while (count--)
*(volatile u_int16_t *)(addr) = value;
+ }
#endif
}
@@ -851,21 +1084,35 @@
bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh,
bus_size_t offset, u_int32_t value, size_t count)
{
- bus_addr_t addr = bsh + offset;
-
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
+ {
+ bus_addr_t addr = bsh.bsh_base + offset;
while (count--)
outl(addr, value);
+ }
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ bus_addr_t addr = bsh.bsh_iat[offset];
+ while (count--)
+ outl(addr, value);
+ }
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
+ {
+ bus_addr_t addr = bsh.bsh_base + offset;
while (count--)
*(volatile u_int32_t *)(addr) = value;
+ }
#endif
}
@@ -895,21 +1142,34 @@
bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
bus_size_t offset, u_int8_t value, size_t count)
{
- bus_addr_t addr = bsh + offset;
-
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
+ {
+ bus_addr_t addr = bsh.bsh_base + offset;
for (; count != 0; count--, addr++)
outb(addr, value);
+ }
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ for (; count != 0; count--, offset++)
+ outb(bsh.bsh_iat[offset], value);
+ }
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
+ {
+ bus_addr_t addr = bsh.bsh_base + offset;
for (; count != 0; count--, addr++)
*(volatile u_int8_t *)(addr) = value;
+ }
#endif
}
@@ -917,21 +1177,34 @@
bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
bus_size_t offset, u_int16_t value, size_t count)
{
- bus_addr_t addr = bsh + offset;
-
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
+ {
+ bus_addr_t addr = bsh.bsh_base + offset;
for (; count != 0; count--, addr += 2)
outw(addr, value);
+ }
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ for (; count != 0; count--, offset += 2)
+ outw(bsh.bsh_iat[offset], value);
+ }
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
+ {
+ bus_addr_t addr = bsh.bsh_base + offset;
for (; count != 0; count--, addr += 2)
*(volatile u_int16_t *)(addr) = value;
+ }
#endif
}
@@ -939,21 +1212,34 @@
bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
bus_size_t offset, u_int32_t value, size_t count)
{
- bus_addr_t addr = bsh + offset;
-
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
+ {
+ bus_addr_t addr = bsh.bsh_base + offset;
for (; count != 0; count--, addr += 4)
outl(addr, value);
+ }
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ for (; count != 0; count--, offset += 4)
+ outl(bsh.bsh_iat[offset], value);
+ }
#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
+ {
+ bus_addr_t addr = bsh.bsh_base + offset;
for (; count != 0; count--, addr += 4)
*(volatile u_int32_t *)(addr) = value;
+ }
#endif
}
@@ -989,14 +1275,13 @@
bus_size_t off1, bus_space_handle_t bsh2,
bus_size_t off2, size_t count)
{
- bus_addr_t addr1 = bsh1 + off1;
- bus_addr_t addr2 = bsh2 + off2;
-
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
{
+ bus_addr_t addr1 = bsh1.bsh_base + off1;
+ bus_addr_t addr2 = bsh2.bsh_base + off2;
if (addr1 >= addr2) {
/* src after dest: copy forward */
for (; count != 0; count--, addr1++, addr2++)
@@ -1004,16 +1289,37 @@
} else {
/* dest after src: copy backwards */
for (addr1 += (count - 1), addr2 += (count - 1);
- count != 0; count--, addr1--, addr2--)
+ count != 0; count--, addr1--, addr2--)
outb(addr2, inb(addr1));
}
}
#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ if (bsh1.bsh_iat[off1] >= bsh2.bsh_iat[off2]) {
+ /* src after dest: copy forward */
+ for (; count != 0; count--, off1++, off2++)
+ outb(bsh2.bsh_iat[off2],
+ inb(bsh1.bsh_iat[off1]));
+ } else {
+ /* dest after src: copy backwards */
+ for (off1 += (count - 1), off2 += (count - 1);
+ count != 0; count--, off1--, off2--)
+ outb(bsh2.bsh_iat[off2],
+ inb(bsh1.bsh_iat[off1]));
+ }
+ }
+#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
+ bus_addr_t addr1 = bsh1.bsh_base + off1;
+ bus_addr_t addr2 = bsh2.bsh_base + off2;
if (addr1 >= addr2) {
/* src after dest: copy forward */
for (; count != 0; count--, addr1++, addr2++)
@@ -1022,7 +1328,7 @@
} else {
/* dest after src: copy backwards */
for (addr1 += (count - 1), addr2 += (count - 1);
- count != 0; count--, addr1--, addr2--)
+ count != 0; count--, addr1--, addr2--)
*(volatile u_int8_t *)(addr2) =
*(volatile u_int8_t *)(addr1);
}
@@ -1035,14 +1341,13 @@
bus_size_t off1, bus_space_handle_t bsh2,
bus_size_t off2, size_t count)
{
- bus_addr_t addr1 = bsh1 + off1;
- bus_addr_t addr2 = bsh2 + off2;
-
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
{
+ bus_addr_t addr1 = bsh1.bsh_base + off1;
+ bus_addr_t addr2 = bsh2.bsh_base + off2;
if (addr1 >= addr2) {
/* src after dest: copy forward */
for (; count != 0; count--, addr1 += 2, addr2 += 2)
@@ -1050,16 +1355,37 @@
} else {
/* dest after src: copy backwards */
for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1);
- count != 0; count--, addr1 -= 2, addr2 -= 2)
+ count != 0; count--, addr1 -= 2, addr2 -= 2)
outw(addr2, inw(addr1));
}
}
#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ if (bsh1.bsh_iat[off1] >= bsh2.bsh_iat[off2]) {
+ /* src after dest: copy forward */
+ for (; count != 0; count--, off1 += 2, off2 += 2)
+ outw(bsh2.bsh_iat[off2],
+ inw(bsh1.bsh_iat[off1]));
+ } else {
+ /* dest after src: copy backwards */
+ for (off1 += 2 * (count - 1), off2 += 2 * (count - 1);
+ count != 0; count--, off1 -= 2, off2 -= 2)
+ outw(bsh2.bsh_iat[off2],
+ inw(bsh1.bsh_iat[off1]));
+ }
+ }
+#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
+ bus_addr_t addr1 = bsh1.bsh_base + off1;
+ bus_addr_t addr2 = bsh2.bsh_base + off2;
if (addr1 >= addr2) {
/* src after dest: copy forward */
for (; count != 0; count--, addr1 += 2, addr2 += 2)
@@ -1068,7 +1394,7 @@
} else {
/* dest after src: copy backwards */
for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1);
- count != 0; count--, addr1 -= 2, addr2 -= 2)
+ count != 0; count--, addr1 -= 2, addr2 -= 2)
*(volatile u_int16_t *)(addr2) =
*(volatile u_int16_t *)(addr1);
}
@@ -1081,14 +1407,13 @@
bus_size_t off1, bus_space_handle_t bsh2,
bus_size_t off2, size_t count)
{
- bus_addr_t addr1 = bsh1 + off1;
- bus_addr_t addr2 = bsh2 + off2;
-
#if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
if (tag == I386_BUS_SPACE_IO)
#endif
{
+ bus_addr_t addr1 = bsh1.bsh_base + off1;
+ bus_addr_t addr2 = bsh2.bsh_base + off2;
if (addr1 >= addr2) {
/* src after dest: copy forward */
for (; count != 0; count--, addr1 += 4, addr2 += 4)
@@ -1101,11 +1426,32 @@
}
}
#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+ if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+ {
+ if (bsh1.bsh_iat[off1] >= bsh2.bsh_iat[off2]) {
+ /* src after dest: copy forward */
+ for (; count != 0; count--, off1 += 4, off2 += 4)
+ outl(bsh2.bsh_iat[off2],
+ inl(bsh1.bsh_iat[off1]));
+ } else {
+ /* dest after src: copy backwards */
+ for (off1 += 4 * (count - 1), off2 += 4 * (count - 1);
+ count != 0; count--, off1 -= 4, off2 -= 4)
+ outl(bsh2.bsh_iat[off2],
+ inl(bsh1.bsh_iat[off1]));
+ }
+ }
+#endif
#if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
- else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+ if (tag == I386_BUS_SPACE_MEM)
#endif
{
+ bus_addr_t addr1 = bsh1.bsh_base + off1;
+ bus_addr_t addr2 = bsh2.bsh_base + off2;
if (addr1 >= addr2) {
/* src after dest: copy forward */
for (; count != 0; count--, addr1 += 4, addr2 += 4)
--- bus_pio_ind.h.orig Sat Dec 25 13:16:09 1999
+++ bus_pio_ind.h Sat Dec 25 13:16:09 1999
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1997 Justin Gibbs.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification, immediately at the beginning of the file.
+ * 2. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _I386_BUS_PIO_IND_H_
+#define _I386_BUS_PIO_IND_H_
+#endif /* _I386_BUS_PIO_IND_H_ */
--- isa.c.orig Sat Dec 25 13:16:38 1999
+++ isa.c Sat Dec 25 13:16:09 1999
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/i386/isa/isa.c,v 1.132 1999/10/12 21:35:46 dfr Exp $
+ * $FreeBSD$
*/
/*
@@ -60,6 +60,7 @@
#include <sys/bus.h>
#include <sys/malloc.h>
#include <machine/bus.h>
+#include <sys/rman.h>
#include <machine/resource.h>
@@ -128,12 +129,105 @@
start, end, count, flags);
}
+#ifdef PC98
+struct resource *
+isa_alloc_resourcev(device_t child, int type, int *rid,
+ bus_addr_t *res, bus_size_t count, u_int flags)
+{
+ struct isa_device* idev = DEVTOISA(child);
+ struct resource_list *rl = &idev->id_resources;
+
+ device_t bus = device_get_parent(child);
+ bus_addr_t ioport;
+ struct resource *re;
+ struct resource **bsre;
+ int i, j, k, linear_cnt, ressz, bsrid;
+
+ ioport = bus_get_resource_start(child, SYS_RES_IOPORT, 0);
+
+ linear_cnt = count;
+ ressz = 1;
+ for (i = 1; i < count; ++i) {
+ if (res[i] > res[i - 1] + 1) {
+ if (i < linear_cnt)
+ linear_cnt = i;
+ ++ressz;
+ }
+ }
+
+ re = isa_alloc_resource(bus, child, type, rid, ioport + res[0],
+ ioport + res[linear_cnt - 1], linear_cnt, flags);
+ if (re == NULL)
+ return NULL;
+
+ bsre = malloc(sizeof (struct resource *) * ressz, M_DEVBUF, M_NOWAIT);
+ if (bsre == NULL) {
+ resource_list_release(rl, bus, child, type, *rid, re);
+ return NULL;
+ }
+ bsre[0] = re;
+
+ for (i = linear_cnt, k = 1; i < count; i = j, k++) {
+ for (j = i + 1; j < count; j++) {
+ if (res[j] > res[j - 1] + 1)
+ break;
+ }
+ bsrid = *rid + k;
+ bsre[k] = isa_alloc_resource(bus, child, type, &bsrid,
+ ioport + res[i], ioport + res[j - 1], j - i, flags);
+ if (bsre[k] == NULL) {
+ for (k--; k >= 0; k--)
+ resource_list_release(rl, bus, child, type,
+ *rid + k, bsre[k]);
+ free(bsre, M_DEVBUF);
+ return NULL;
+ }
+ }
+
+ re->r_bushandle.bsh_res = bsre;
+ re->r_bushandle.bsh_ressz = ressz;
+
+ return re;
+}
+
+int
+isa_load_resourcev(struct resource *re, bus_addr_t *res, bus_size_t count)
+{
+ bus_addr_t *addr;
+ int i;
+
+ addr = malloc(sizeof (bus_addr_t) * count, M_DEVBUF, M_NOWAIT);
+ if (addr == NULL)
+ return 1;
+
+ for (i = 0; i < count; i++)
+ addr[i] = rman_get_start(re) + res[i];
+
+ rman_set_bustag(re, I386_BUS_SPACE_IO_IND);
+ re->r_bushandle.bsh_iat = addr;
+ re->r_bushandle.bsh_iatsz = count;
+
+ return 0;
+}
+#endif
+
int
isa_release_resource(device_t bus, device_t child, int type, int rid,
struct resource *r)
{
struct isa_device* idev = DEVTOISA(child);
struct resource_list *rl = &idev->id_resources;
+#ifdef PC98
+ int i;
+
+ for (i = 1; i < r->r_bushandle.bsh_ressz; i++)
+ resource_list_release(rl, bus, child, type, rid + i,
+ r->r_bushandle.bsh_res[i]);
+ if (r->r_bushandle.bsh_res != NULL)
+ free(r->r_bushandle.bsh_res, M_DEVBUF);
+ if (r->r_bushandle.bsh_iat != NULL)
+ free(r->r_bushandle.bsh_iat, M_DEVBUF);
+#endif
return resource_list_release(rl, bus, child, type, rid, r);
}
--- nexus.c.orig Sat Dec 25 13:34:22 1999
+++ nexus.c Sat Dec 25 13:16:09 1999
@@ -26,7 +26,7 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/i386/i386/nexus.c,v 1.22 1999/12/03 08:41:13 mdodd Exp $
+ * $FreeBSD$
*/
/*
@@ -303,10 +303,26 @@
}
rman_set_virtual(rv, vaddr);
rman_set_bustag(rv, I386_BUS_SPACE_MEM);
+#ifdef PC98
+ rv->r_bushandle.bsh_base = (bus_addr_t) vaddr;
+ rv->r_bushandle.bsh_iat = NULL;
+ rv->r_bushandle.bsh_iatsz = 0;
+ rv->r_bushandle.bsh_res = NULL;
+ rv->r_bushandle.bsh_ressz = 0;
+#else
rman_set_bushandle(rv, (bus_space_handle_t) vaddr);
+#endif
} else if (type == SYS_RES_IOPORT) {
rman_set_bustag(rv, I386_BUS_SPACE_IO);
+#ifdef PC98
+ rv->r_bushandle.bsh_base = rv->r_start;
+ rv->r_bushandle.bsh_iat = NULL;
+ rv->r_bushandle.bsh_iatsz = 0;
+ rv->r_bushandle.bsh_res = NULL;
+ rv->r_bushandle.bsh_ressz = 0;
+#else
rman_set_bushandle(rv, rv->r_start);
+#endif
}
if (needactivate) {