From owner-acpi-jp@jp.freebsd.org  Mon Aug  7 22:29:56 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id WAA62712;
	Mon, 7 Aug 2000 22:29:56 +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 WAA62707
	for <acpi-jp@jp.freebsd.org>; Mon, 7 Aug 2000 22:29:55 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from localhost (iwasaki.imasy.or.jp [202.227.24.92])
	by tasogare.imasy.or.jp (8.10.2+3.3W/3.7W-tasogare/smtpfeed 1.07) with ESMTP id e77DTlZ67922
	for <acpi-jp@jp.freebsd.org>; Mon, 7 Aug 2000 22:29:47 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
To: acpi-jp@jp.freebsd.org
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: <20000807222943K.iwasaki@jp.FreeBSD.org>
Date: Mon, 07 Aug 2000 22:29:43 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 20000228(IM140)
Lines: 253
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: acpi-jp 536
Subject: [acpi-jp 536] aml_region.c: the rest are implemented
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

kernel $BHG$N(B region I/O $B$N8e2s$7$K$7$F$$$?<BAu$N;D$j$rJRIU$1$^$7$?!#(B
aml_region_read_into_buffer(), aml_region_write_from_buffer(),
aml_region_bcopy() $B$G$9!#:#$N$H$3$m(B region type $B$,(B SystemMemory $B$H(B
$B2>Dj$7$?<BAu$H$J$C$F$$$^$9$,!"LdBj$,$"$k$h$&$G$7$?$i%D%C%3%_$*4j$$(B
$B$7$^$9!#(B
$B0J2<%Q%C%A$G$9!#$A$g$C$H$7$?(B cleanup $B$b4^$s$G$$$^$9!#(B

Index: dev/acpi/aml/aml_region.c
===================================================================
RCS file: /home/cvs/ACPI/sys/dev/acpi/aml/aml_region.c,v
retrieving revision 1.8
diff -u -r1.8 aml_region.c
--- dev/acpi/aml/aml_region.c	2000/08/03 16:00:04	1.8
+++ dev/acpi/aml/aml_region.c	2000/08/06 21:26:10
@@ -45,8 +45,14 @@
 #define AML_REGION_INPUT	0
 #define AML_REGION_OUTPUT	1
 
+#define AML_REGION_SYSMEM	0
+#define AML_REGION_SYSIO	1
+#define AML_REGION_PCICFG	2
+#define AML_REGION_EMBCTL	3
+#define AML_REGION_SMBUS	4
+
 static int
-aml_region_io_system(struct aml_environ *env, int io, int regtype,
+aml_region_io_system(struct aml_environ *env, boolean_t io, int regtype,
     u_int32_t flags, u_int32_t *valuep, u_int32_t baseaddr,
     u_int32_t bitoffset, u_int32_t bitlen)
 {
@@ -92,10 +98,10 @@
 		    offsethigh, maskhigh, ~maskhigh & 0xff);
 	}
 
-	if (regtype == 0) {
+	if (regtype == AML_REGION_SYSMEM) {
 		OsdMapMemory((void *)addr, bytelen, (void **)&vaddr);
 	}
-	if (regtype == 2) {
+	if (regtype == AML_REGION_PCICFG) {
 		/* Access to PCI Config space */
 		struct aml_name *pci_info;
 
@@ -128,7 +134,7 @@
 		switch (io) {
 		case AML_REGION_INPUT:
 			switch (regtype) {
-			case 0:
+			case AML_REGION_SYSMEM:
 				/* XXX should be MI */
 				switch (bitlen) {
 				case 8:
@@ -144,7 +150,7 @@
 					break;
 				}
 				break;
-			case 1:
+			case AML_REGION_SYSIO:
 				switch (bitlen) {
 				case 8:
 					value = OsdIn8(addr);
@@ -159,7 +165,7 @@
 					break;
 				}
 				break;
-			case 2:
+			case AML_REGION_PCICFG:
 				switch (bitlen) {
 				case 8:
 					OsdReadPciCfgByte(pci_bus, pci_devfunc,
@@ -187,7 +193,7 @@
 			break;
 		case AML_REGION_OUTPUT:
 			switch (regtype) {
-			case 0:
+			case AML_REGION_SYSMEM:
 				/* XXX should be MI */
 				switch (bitlen) {
 				case 8:
@@ -203,7 +209,7 @@
 					break;
 				}
 				break;
-			case 1:
+			case AML_REGION_SYSIO:
 				switch (bitlen) {
 				case 8:
 					value &= 0xff;
@@ -218,7 +224,7 @@
 					break;
 				}
 				break;
-			case 2:
+			case AML_REGION_PCICFG:
 				switch (bitlen) {
 				case 8:
 					OsdWritePciCfgByte(pci_bus, pci_devfunc,
@@ -247,13 +253,13 @@
 	for (i = 0; i < bytelen; i++) {
 		/* XXX */
 		switch (regtype) {
-		case 0:
+		case AML_REGION_SYSMEM:
 			val = *(volatile u_int8_t *)(vaddr + i);
 			break;
-		case 1:
+		case AML_REGION_SYSIO:
 			val = OsdIn8(addr + i);
 			break;
-		case 2:
+		case AML_REGION_PCICFG:
 			OsdReadPciCfgByte(pci_bus, pci_devfunc, addr + i, &val);
 			break;
 		default:
@@ -318,13 +324,13 @@
 
 			/* XXX */
 			switch (regtype) {
-			case 0:
+			case AML_REGION_SYSMEM:
 				*(volatile u_int8_t *)(vaddr + i) = val;
 				break;
-			case 1:
+			case AML_REGION_SYSIO:
 				OsdOut8(addr + i, val);
 				break;
-			case 2:
+			case AML_REGION_PCICFG:
 				OsdWritePciCfgByte(pci_bus, pci_devfunc,
 				    addr + i, val);
 				break;
@@ -339,7 +345,7 @@
 	}
 
 io_done:
-	if (regtype == 0) {
+	if (regtype == AML_REGION_SYSMEM) {
 		OsdUnMapMemory((void *)vaddr, bytelen);
 	}
 
@@ -348,6 +354,48 @@
 	return (state);
 }
 
+static int
+aml_region_io_buffer(boolean_t io, int regtype, u_int32_t flags,
+    u_int8_t *buffer, u_int32_t baseaddr, u_int32_t bitoffset, u_int32_t bitlen)
+{
+	vm_offset_t	addr, vaddr;
+	size_t		len;
+	const char	*funcname[] = {
+		"aml_region_read_into_buffer",
+		"aml_region_write_from_buffer"
+	};
+
+	if (regtype != AML_REGION_SYSMEM) {
+		printf("%s: region type isn't system memory!\n", funcname[io]);
+		return (-1);
+	}
+
+	if (bitlen % 8) {
+		printf("%s: bit length isn't a multiple of 8!\n", funcname[io]);
+	}
+	if (bitoffset % 8) {
+		printf("%s: bit offset isn't a multiple of 8!\n", funcname[io]);
+	}
+
+	addr = baseaddr + bitoffset / 8;
+	len = bitlen / 8 + ((bitlen % 8) ? 1 : 0);
+
+	OsdMapMemory((void *)addr, len, (void **)&vaddr);
+
+	switch (io) {
+	case AML_REGION_INPUT:
+		bcopy((void *)vaddr, (void *)buffer, len);
+		break;
+	case AML_REGION_OUTPUT:
+		bcopy((void *)buffer, (void *)vaddr, len);
+		break;
+	}
+
+	OsdUnMapMemory((void *)vaddr, len);
+
+	return (0);
+}
+
 u_int32_t
 aml_region_read(struct aml_environ *env, int regtype, u_int32_t flags,
     u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen)
@@ -367,7 +415,12 @@
     u_int32_t flags, u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen,
     u_int8_t *buffer)
 {
-	return (0);
+	int	state;
+
+	state = aml_region_io_buffer(AML_REGION_INPUT, regtype, flags,
+	    buffer, addr, bitoffset, bitlen);
+
+        return (state);
 }
 
 int
@@ -388,7 +441,12 @@
     u_int32_t flags, u_int8_t *buffer, u_int32_t addr, u_int32_t bitoffset,
     u_int32_t bitlen)
 {
-	return (0);
+	int	state;
+
+	state = aml_region_io_buffer(AML_REGION_OUTPUT, regtype, flags,
+	    buffer, addr, bitoffset, bitlen);
+
+        return (state);
 }
 
 int
@@ -396,5 +454,35 @@
     u_int32_t flags, u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen,
     u_int32_t dflags, u_int32_t daddr, u_int32_t dbitoffset, u_int32_t dbitlen)
 {
+	vm_offset_t	from_addr, from_vaddr;
+	vm_offset_t	to_addr, to_vaddr;
+	size_t		len;
+
+	if (regtype != AML_REGION_SYSMEM) {
+		printf("aml_region_bcopy: region type isn't system memory!\n");
+		return (-1);
+	}
+
+	if ((bitlen % 8) || (dbitlen % 8)) {
+		printf("aml_region_bcopy: bit length isn't a multiple of 8!\n");
+	}
+	if ((bitoffset % 8) || (dbitoffset % 8)) {
+		printf("aml_region_bcopy: bit offset isn't a multiple of 8!\n");
+	}
+
+	from_addr = addr + bitoffset / 8;
+	to_addr = daddr + dbitoffset / 8;
+
+	len = (bitlen > dbitlen) ? dbitlen : bitlen;
+	len = len / 8 + ((len % 8) ? 1 : 0);
+
+	OsdMapMemory((void *)from_addr, len, (void **)&from_vaddr);
+	OsdMapMemory((void *)to_addr, len, (void **)&to_vaddr);
+
+	bcopy((void *)from_vaddr, (void *)to_vaddr, len);
+
+	OsdUnMapMemory((void *)from_vaddr, len);
+	OsdUnMapMemory((void *)to_vaddr, len);
+
 	return (0);
 }
