From owner-acpi-jp@jp.freebsd.org  Wed Jun 28 18:42:34 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id SAA72795;
	Wed, 28 Jun 2000 18:42:34 +0900 (JST)
	(envelope-from owner-acpi-jp@jp.FreeBSD.org)
Received: from tasogare.imasy.or.jp (daemon@tasogare.imasy.or.jp [202.227.24.5])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id SAA72790
	for <acpi-jp@jp.freebsd.org>; Wed, 28 Jun 2000 18:42:34 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from localhost (isdn34.imasy.or.jp [202.227.24.226])
	by tasogare.imasy.or.jp (8.10.1+3.3W/3.7W-tasogare/smtpfeed 1.07) with ESMTP id e5S9gUp05769
	for <acpi-jp@jp.freebsd.org>; Wed, 28 Jun 2000 18:42:30 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
To: acpi-jp@jp.freebsd.org
In-Reply-To: <20000628161407J.yokoyama@o3.otc.ogis-ri.co.jp>
References: <20000627092046Y.iwasaki@jp.FreeBSD.org>
	<20000628161407J.yokoyama@o3.otc.ogis-ri.co.jp>
X-Mailer: Mew version 1.94.1 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Message-Id: <20000628184229U.iwasaki@jp.FreeBSD.org>
Date: Wed, 28 Jun 2000 18:42:29 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 20000228(IM140)
Lines: 344
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: acpi-jp 453
Subject: [acpi-jp 453] Re: merging to FreeBSD
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

> # $B$A$g$C$HK\6H$,>G$25$L#$J$N$G!";XE&$@$1$G$4$+$s$Y$s$r(B

$B$$$($$$(=u$+$j$^$9!#(B

> In Message [acpi-jp:443] <20000627092046Y.iwasaki@jp.FreeBSD.org>
> 	Mitsuru IWASAKI <iwasaki@jp.freebsd.org> wrote:
> 
> $B$N(B aml_region.c $B$N%Q%C%A$G$9$,!"$*$+$7$/$J$$$G$7$g$&$+!)(B

$B$`$A$c$/$A$c$G$7$?(B (^^;  $BESCf$G%F%9%H$7$F$_$?$i$?$^$?$^$&$^$/(B
$BF0$$$A$c$C$?$N$G!"$=$N$^$^$K$J$C$F$^$7$?!#(B

> $B$N$H$3$m$G!"%Q%C%AA0$K$O!"(Bhi-address -> low-address $B$N=g$GFI$_9~$s$G$$$k$N$KBP$7$F!"(B

> $B%Q%C%A8e$O!"(Blow-address -> hi-address $B$N=g$GFI$_9~$`MM$KJQ99$7$F$$$^$9$,!"(B
> $B$3$N8e$N!"(Bbyte$BC10L$GFI$_9~$s$@CM$rAH$_N)$F$F$$$k=j$O2?$b=$@5$5$l$F$$$^$;$s!#(B
> $B$D$$$G$K!"$:$C$HF1$8%]!<%H$r(B I/O $B$7$F$$$k$h$&$G$9$7!#(B

$B$A$g$C$HJ6$i$o$7$$$N$G$9$,!"JQ99A0$b8e$b(B low-address -> hi-address $B$H(B
$B$J$C$F$$$^$9$,!"JQ998e$O(B [v]addr + i $B$G%"%I%l%9$rI=8=$9$Y$-$G$7$?!#(B
$B$^$?!":G=i$N(B byte$B!":G8e$N(B byte $B$N%A%'%C%/$bJQ99MW$G$9$M!#(B

$B$H$$$&$o$1$G!"(Baml_region.c $B$@$1$b$&0lEY!#(B

Index: aml_region.c
===================================================================
RCS file: /home/cvs/ACPI/sys/i386/acpi/aml/aml_region.c,v
retrieving revision 1.4
diff -u -r1.4 aml_region.c
--- aml_region.c	2000/06/18 17:51:32	1.4
+++ aml_region.c	2000/06/28 09:20:33
@@ -32,143 +32,34 @@
 
 #include <sys/param.h>
 #include <sys/systm.h>
-#include <machine/bus.h>
+#include <machine/pc/acpi.h>
 
 #include <i386/acpi/aml/aml_common.h>
 #include <i386/acpi/aml/aml_region.h>
 
-/*
- * ACPICA compatibility
- */
-typedef unsigned char			UINT8;
-typedef unsigned short			UINT16;
-typedef unsigned int			UINT32;
-typedef UINT32				NATIVE_UINT;
-typedef NATIVE_UINT			ACPI_IO_ADDRESS;
-
-static UINT32	OsdInX(ACPI_IO_ADDRESS, int);
-static void	OsdOutX(ACPI_IO_ADDRESS, UINT32, int);
-
-UINT8		OsdIn8(ACPI_IO_ADDRESS);
-UINT16		OsdIn16(ACPI_IO_ADDRESS);
-UINT32		OsdIn32(ACPI_IO_ADDRESS);
-void		OsdOut8(ACPI_IO_ADDRESS, UINT8);
-void		OsdOut16(ACPI_IO_ADDRESS, UINT16);
-void		OsdOut32(ACPI_IO_ADDRESS, UINT32);
-
-/*
- * Platform/Hardware independent I/O interfaces
- */
+#define AML_REGION_INPUT	0
+#define AML_REGION_OUTPUT	1
 
-static UINT32
-OsdInX(ACPI_IO_ADDRESS InPort, int bytes)
-{
-	bus_space_tag_t		bst;
-	bus_space_handle_t	bsh;
-	UINT32			retval;
-
-	bst = I386_BUS_SPACE_IO;
-	bsh = InPort;
-	switch (bytes) {
-	case 1:
-		retval = bus_space_read_1(bst, bsh, 0);
-		break;
-	case 2:
-		retval = bus_space_read_2(bst, bsh, 0);
-		break;
-	case 4:
-		retval = bus_space_read_4(bst, bsh, 0);
-		break;
-	default:
-		printf("OsdInX: wrong length to read\n");
-		retval = 0;
-	}
-	return (retval);
-}
-
-UINT8
-OsdIn8(ACPI_IO_ADDRESS InPort)
-{
-	return (OsdInX(InPort, 1) & 0xff);
-}
- 
-UINT16
-OsdIn16(ACPI_IO_ADDRESS InPort)
-{
-	return (OsdInX(InPort, 2) & 0xffff);
-}
- 
-UINT32
-OsdIn32(ACPI_IO_ADDRESS InPort)
-{
-	return (OsdInX(InPort, 4));
-}
-
-static void
-OsdOutX(ACPI_IO_ADDRESS OutPort, UINT32 Value, int bytes)
-{
-	bus_space_tag_t		bst;
-	bus_space_handle_t	bsh;
-
-	bst = I386_BUS_SPACE_IO;
-	bsh = OutPort;
-	switch (bytes) {
-	case 1:
-		bus_space_write_1(bst, bsh, 0, Value & 0xff);
-		break;
-	case 2:
-		bus_space_write_2(bst, bsh, 0, Value & 0xffff);
-		break;
-	case 4:
-		bus_space_write_4(bst, bsh, 0, Value);
-		break;
-	default:
-		printf("OsdOutX: wrong length to write\n");
-	}
-}
-
-void
-OsdOut8(ACPI_IO_ADDRESS OutPort, UINT8 Value)
-{
-	OsdOutX(OutPort, Value, 1);
-}
-
-void    
-OsdOut16(ACPI_IO_ADDRESS OutPort, UINT16 Value)
-{
-	OsdOutX(OutPort, Value, 2);
-}
-
-void
-OsdOut32(ACPI_IO_ADDRESS OutPort, UINT32 Value)
-{
-	OsdOutX(OutPort, Value, 4);
-}
-
-/*
- * region I/O
- */
-
-static int	aml_region_io_systemio(int, int, u_int32_t, u_int32_t *,
-				       u_int32_t, u_int32_t, u_int32_t);
-
-#define ACPI_REGION_INPUT	0
-#define ACPI_REGION_OUTPUT	1
-
 static int
-aml_region_io_systemio(int io, int regtype, u_int32_t flags, u_int32_t *valuep,
+aml_region_io_system(int io, int regtype, u_int32_t flags, u_int32_t *valuep,
     u_int32_t baseaddr, u_int32_t bitoffset, u_int32_t bitlen)
 {
 	u_int8_t	val, tmp, masklow, maskhigh;
 	u_int8_t	offsetlow, offsethigh;
-	u_int32_t	addr, byteoffset, bytelen;
+	vm_offset_t	addr, vaddr, byteoffset, bytelen;
 	int		value, readval;
 	int		state, i;
+	int		debug;
+
+	/* save debug level and shut it up */
+	debug = aml_debug;
+	aml_debug = 0;
 
 	value = *valuep;
 	val = readval = 0;
 	masklow = maskhigh = 0xff;
 	state = 0;
+	vaddr = 0;
 
 	byteoffset = bitoffset / 8;
 	bytelen = bitlen / 8 + ((bitlen % 8) ? 1 : 0);
@@ -191,30 +82,48 @@
 		AML_PRINTF("\t[offsethigh = 0x%x, maskhigh = 0x%x, ~maskhigh = 0x%x]\n",
 		    offsethigh, maskhigh, ~maskhigh & 0xff);
 	}
-	for (i = bytelen; i > 0; i--, addr++) {
-		val = OsdIn8(addr);
-		AML_PRINTF("\t[%d:0x%02x@0x%x]", regtype, val, addr);
+
+	if (regtype == 0) {
+		OsdMapMemory((void *)addr, bytelen, (void **)&vaddr);
+	}
+	for (i = 0; i < bytelen; i++) {
+		/* XXX */
+		switch (regtype) {
+		case 0:
+			val = *(volatile u_int8_t *)(vaddr + i);
+			break;
+		case 1:
+			val = OsdIn8(addr + i);
+			break;
+		default:
+			printf("aml_region_io_system: not supported yet (%d)\n",
+			    regtype);
+			val = 0;
+			break;
+		}
+
+		AML_PRINTF("\t[%d:0x%02x@0x%x]", regtype, val, addr + i);
 
 		switch (io) {
-		case ACPI_REGION_INPUT:
+		case AML_REGION_INPUT:
 			tmp = val;
 			/* the lowest byte? */
-			if (i == bytelen) {
+			if (i == 0) {
 				if (offsetlow) {
 					readval = tmp & ~masklow;
 				} else {
 					readval = tmp;
 				}
 			} else {
-				if (i == 1 && offsethigh) {
+				if (i == bytelen - 1 && offsethigh) {
 					tmp = tmp & ~maskhigh;
 				}
-				readval = (tmp << (8 * (bytelen - i))) | readval;
+				readval = (tmp << (8 * i)) | readval;
 			}
 
 			AML_PRINTF("\n");
 			/* goto to next byte... */
-			if (i > 1) {
+			if (i < bytelen - 1) {
 				continue;
 			}
 			/* final adjustment before finishing region access */
@@ -222,34 +131,54 @@
 				readval = readval >> offsetlow;
 			}
 			AML_PRINTF("\t[read(%d, 0x%x)&mask:0x%x]\n",
-			    regtype, addr, readval);
+			    regtype, addr + i, readval);
 			value = readval;
 			*valuep = value;
 
 			break;
-		case ACPI_REGION_OUTPUT:
+		case AML_REGION_OUTPUT:
 			tmp = value & 0xff;
 			/* the lowest byte? */
-			if (i == bytelen) {
+			if (i == 0) {
 				if (offsetlow) {
 					tmp = (val & masklow) | tmp << offsetlow;
 				}
 				value = value >> (8 - offsetlow);
 			} else {
-				if (i == 1 && offsethigh) {
+				if (i == bytelen - 1 && offsethigh) {
 					tmp = (val & maskhigh) | tmp;
 				}
 				value = value >> 8;
 			}
 
 			AML_PRINTF("->[%d:0x%02x@0x%x]\n",
-				    regtype, tmp, addr);
+				    regtype, tmp, addr + i);
 			val = tmp;
-			OsdOut8(addr, val);
+
+			/* XXX */
+			switch (regtype) {
+			case 0:
+				*(volatile u_int8_t *)(vaddr + i) = val;
+				break;
+			case 1:
+				OsdOut8(addr + i, val);
+				break;
+			default:
+				printf("aml_region_io_system: not supported yet (%d)\n",
+				    regtype);
+				break;
+			}
+
 			break;
 		}
 	}
 
+	if (regtype == 0) {
+		OsdUnMapMemory((void *)vaddr, bytelen);
+	}
+
+	aml_debug = debug;	/* restore debug devel */
+
 	return (state);
 }
 
@@ -260,16 +189,9 @@
 	int	value;
 	int	state;
 
-	value = 0;
-	switch (regtype) {
-	case 1:
-		state = aml_region_io_systemio(ACPI_REGION_INPUT, regtype,
-		    flags, &value, addr, bitoffset, bitlen);
-		AML_SYSASSERT(state != -1);
-		break;
-	default:
-		printf("aml_region_read: not supported yet\n");
-	}
+	state = aml_region_io_system(AML_REGION_INPUT, regtype,
+	    flags, &value, addr, bitoffset, bitlen);
+	AML_SYSASSERT(state != -1);
 
         return (value);
 }
@@ -287,16 +209,9 @@
 {
 	int	state;
 
-	state = 0;
-	switch (regtype) {
-	case 1:
-		state = aml_region_io_systemio(ACPI_REGION_OUTPUT, regtype,
-		    flags, &value, addr, bitoffset, bitlen);
-		AML_SYSASSERT(state != -1);
-		break;
-	default:
-		printf("aml_region_write: not supported yet\n");
-	}
+	state = aml_region_io_system(AML_REGION_OUTPUT, regtype,
+	    flags, &value, addr, bitoffset, bitlen);
+	AML_SYSASSERT(state != -1);
 
         return (state);
 }
