Date: Sat, 25 Dec 1999 14:12:12 +0900 From: KATO Takenori <kato@ganko.eps.nagoya-u.ac.jp> To: FreeBSD-current@FreeBSD.ORG, FreeBSD98-hackers@jp.freebsd.org Subject: Re: indirection in bus space Message-ID: <19991225141212T.kato@gneiss.eps.nagoya-u.ac.jp> In-Reply-To: Your message of "Sat, 25 Dec 1999 14:07:25 %2B0900" <19991225140725U.kato@gneiss.eps.nagoya-u.ac.jp> References: <19991225140725U.kato@gneiss.eps.nagoya-u.ac.jp>
next in thread | previous in thread | raw e-mail | index | archive | help
----Next_Part(Sat_Dec_25_14:12:03_1999_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Oops, I forget to include patches. KATO Takenori <kato@ganko.eps.nagoya-u.ac.jp> wrote: > Attached patches provides indirection support in bus space stuff > (submitted by Takahashi-san <nyan@FreeBSD.ORG> with minor modification > by me). > > I <kato@ganko.eps.nagoya-u.ac.jp> 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 <kato@ganko.eps.nagoya-u.ac.jp> | 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! +==========================+ ----Next_Part(Sat_Dec_25_14:12:03_1999_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=bus.h.diff --- 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) ----Next_Part(Sat_Dec_25_14:12:03_1999_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=bus_pio_ind.h.diff --- 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_ */ ----Next_Part(Sat_Dec_25_14:12:03_1999_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=isa.c.diff --- 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); } ----Next_Part(Sat_Dec_25_14:12:03_1999_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=nexus.c.diff --- 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) { ----Next_Part(Sat_Dec_25_14:12:03_1999_809)---- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19991225141212T.kato>