From owner-acpi-jp@jp.freebsd.org  Sat Jul 22 13:13:36 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id NAA04653;
	Sat, 22 Jul 2000 13:13:36 +0900 (JST)
	(envelope-from owner-acpi-jp@jp.FreeBSD.org)
Received: from kbtfw.kubota.co.jp (firewall-user@kbtfw.kubota.co.jp [133.253.102.202])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id NAA04648
	for <acpi-jp@jp.freebsd.org>; Sat, 22 Jul 2000 13:13:35 +0900 (JST)
	(envelope-from haro@tk.kubota.co.jp)
Received: by kbtfw.kubota.co.jp; id NAA11710; Sat, 22 Jul 2000 13:13:28 +0900 (JST)
Received: from unknown(133.253.122.1) by kbtfw.kubota.co.jp via smap (V4.2)
	id xma011678; Sat, 22 Jul 00 13:12:40 +0900
Received: from jkpc15.tk.kubota.co.jp ([192.168.7.250])
	by kbtmx.eto.kubota.co.jp (8.9.3+3.2W/3.7W) with ESMTP id NAA20728;
	Sat, 22 Jul 2000 13:12:34 +0900 (JST)
Received: from localhost (localhost.ttr.kubota.co.jp [127.0.0.1])
	by jkpc15.tk.kubota.co.jp (8.9.3/3.7W-02/21/99) with ESMTP id NAA05642;
	Sat, 22 Jul 2000 13:10:15 +0900 (JST)
To: acpi-jp@jp.freebsd.org, takawata@shidahara1.planet.sci.kobe-u.ac.jp
In-Reply-To: <200007211024.TAA56505@shidahara1.planet.sci.kobe-u.ac.jp>
References: <20000721191350O.yokoyama@o3.otc.ogis-ri.co.jp>
	<200007211024.TAA56505@shidahara1.planet.sci.kobe-u.ac.jp>
X-Mailer: Mew version 1.94.1 on Emacs 20.6 / Mule 4.0 (HANANOEN)
Mime-Version: 1.0
Content-Type: Multipart/Mixed;
 boundary="--Next_Part(Sat_Jul_22_13:08:22_2000_809)--"
Content-Transfer-Encoding: 7bit
Message-Id: <20000722131015Z.haro@tk.kubota.co.jp>
Date: Sat, 22 Jul 2000 13:10:15 +0900
From: haro@tk.kubota.co.jp (Munehiro Matsuda)
X-Dispatcher: imput version 990905(IM130)
Lines: 347
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: acpi-jp 487
Subject: [acpi-jp 487] Re: PCI_Config space support for aml_region_*()
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: haro@tk.kubota.co.jp

----Next_Part(Sat_Jul_22_13:08:22_2000_809)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

$B>>ED!w%/%\%?$G$9!#(B

From: Takanori Watanabe <takawata@shidahara1.planet.sci.kobe-u.ac.jp>
Date: Fri, 21 Jul 2000 19:24:55 +0900
::>$BB?J,!"(B_HID $B$H$+$r(B key $B$KC5$7$F$d$l$P$$$$$s$@$H;W$$$^$9!#(B
::>bus No. $B$O(B _BBN $B$+$J!)(B

$B$r$r!#(B_BBN$B$J$s$F$N$,M-$C$?$N$G$9$M!#5$$,IU$-$^$;$s$G$7$?!#(B(^^;

$B:#2s$N(BPCI_Config space$B$X$N%"%/%;%9$N7o$G$O!"(BPCI$B%P%9$=$N$b$N$rC5$9$N$,(B
$BL\E*$G$O$J$/!"%P%9HV9f$NF~<j$,=EMW$JLu$G$9!#(B
$B$7$?$,$C$F!"5!G=E*$K$O(B _BBN$B$G==J,$@$H;W$$$^$9!#(B

::$B%k!<%H%P%9$O(B\_SB$B$N2<$N(B_HID$B$,!"(B0x030ad041$B$G$"$kE[$rC5$7$F!"$=$l$N(B_BBN$B$r(B
::$B;H$&$N$ONI$$$N$G$9$,!"$=$N8e(BPCI-toPCI$B%V%j%C%8$N;~$O%P%9%V%j%C%8HV9f$O(B
::PCI$B%P%9%V%j%C%8$r(Bprobe$B$7$F$d$kI,MW$,$"$j$^$9!#(B

$B$H$$$&$3$H$O!"(B_BBN$B$N@bL@$N(B "For multi-root PCI machines, _BBN is the
PCI bus number that the BIOS sets up."$B$K$*$$$F!"(BPCI-to-PCI$B%V%j%C%8$N@h$N(B
PCI$B%P%9$^$G$O!"%P%9HV9f$rIU$1$F$/$l$J$$$H$$$&$3$H$J$N$G$7$g$&$+!)(B $B$&!A$s!#(B

$B$3$3$G!"(Butil/takawata/acpi/*.dsdt.dat$B$NFbMF$r%A%'%C%/$7$F$_$^$7$?!#(B
    (1) PCI$B$NDj5A$,#2$D0J>eM-$k$b$N(B    $B!'(Bdell.dsdt.dat
    (2) PCI$B#1K\$G(B_BBN$B$,Dj5A$5$l$F$k$b$N!'(BDell_I7500.dsdt.dat
					 TP240.dsdt.dat
					 Z505D.dsdt.dat
					 Z505FX.dsdt.dat
    (3) PCI$B#1K\$G(B_BBN$B$,Dj5A$5$l$F$$$J$$!'$=$NB>;D$j(B

dell.dsdt.dat$B$r>\$7$/8+$k$H!"(BPCI0$B$NG[2<$K(BPCI1$B$,Dj5A$5$l$F$*$j!"(BPCI-to-PCI
$B%V%j%C%87PM3$H9M$($i$l$^$9!#$7$+$7$J$,$i!"(BPCI1$B$K4X$7$F$O(B _HID$B$9$iDj5A(B
$B$5$l$F$*$j$^$;$s!#$3$l$O!"$I$&$$$C$?9=@.$J$N$7$g$&$+!)(B

$B$3$N$^$^$@$H?HF0$-=PMh$J$/$J$k$N$G!"$H$j$"$($:0J2<$NMM$K$7$^$7$?!#(B

	pci_info = aml_search_name(env, "_BBN");
	if (!pci_info){
		pcicfg.bus = 0;
	} else {
		pcicfg.bus = pci_info->property->num.number & 0xff;
	}

$B$b$7:#8e!"J#?t$N(BPCI$B%P%9$r;}$D%7%9%F%`$GLdBj$,M-$k$h$&$J$i!"$=$N;~$^$?(B
$B9M$(D>$7$F$_$?$$$H;W$$$^$9!#(B

$B$H$j$"$($::rF|$N(Bpatch$B$OGK4~$7$F!":#EY$N(Bpatch$B$rEv$FD>$7$F$*;n$72<$5$$!#(B

$B$G$O!#(B
=--------------------------------------------------------------------------
           _ _           $B3t<02q<R%/%\%?(B $BEl5~K\<R(B $B5;=Q3+H/K\It(B
 -|- /_\  |_|_|            $B>>ED(B  $B=!9@(B
 /|\ |_|  |_|_|          E-mail: haro@kubota.co.jp
                         Tel: 03-3245-3318  Fax: 03-3245-3315

----Next_Part(Sat_Jul_22_13:08:22_2000_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="pci_config_2.patch"

diff -ru acpi/aml/aml_evalobj.c.org acpi/aml/aml_evalobj.c
--- acpi/aml/aml_evalobj.c.org	Fri Jul 14 18:49:43 2000
+++ acpi/aml/aml_evalobj.c	Fri Jul 21 08:43:46 2000
@@ -103,9 +103,9 @@
 			AML_PRINTF("[read(From%d, 0x%x)]",
 			    or->space, or->offset + field->bitoffset / 8);
 			env->tempobject.type = aml_t_num;
-			env->tempobject.num.number = aml_region_read(or->space,
-			    field->flags, or->offset, field->bitoffset,
-			    field->bitlen);
+			env->tempobject.num.number = aml_region_read(env,
+			    or->space, field->flags, or->offset,
+			    field->bitoffset, field->bitlen);
 		}
 	} else if (field->f.ftype == f_t_index) {
 		wname = aml_search_name(env, field->f.ifld.indexname);
diff -ru acpi/aml/aml_region.c.org acpi/aml/aml_region.c
--- acpi/aml/aml_region.c.org	Fri Jul 14 18:49:43 2000
+++ acpi/aml/aml_region.c	Fri Jul 21 21:22:28 2000
@@ -33,20 +33,24 @@
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/acpi.h>
+#include <pci/pcivar.h>
 
 #include <dev/acpi/aml/aml_common.h>
 #include <dev/acpi/aml/aml_region.h>
+#include <dev/acpi/aml/aml_name.h>
 
 #define AML_REGION_INPUT	0
 #define AML_REGION_OUTPUT	1
 
 static int
-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)
+aml_region_io_system(struct aml_environ *env, 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;
 	vm_offset_t	addr, vaddr, byteoffset, bytelen;
+	pcicfgregs	pcicfg;
 	int		value, readval;
 	int		state, i;
 	int		debug;
@@ -86,6 +90,42 @@
 	if (regtype == 0) {
 		OsdMapMemory((void *)addr, bytelen, (void **)&vaddr);
 	}
+	if (regtype == 2) {
+		/* Access to PCI Config space */
+		struct aml_name *pci_info;
+
+		/*
+		 * XXX Hack for Alpha(tsunami) systems.
+		 * pcicfg.hose is set to -1 in the hope that,
+		 * tsunami_cfgreadX() will set it up right.
+		 * Other Alpha systems (and i386's) don't seem to use hose.
+		 */
+		pcicfg.hose = -1;
+
+		/* Obtain PCI bus number */
+		pci_info = aml_search_name(env, "_BBN");
+		if (!pci_info || pci_info->property->type != aml_t_num) {
+			AML_PRINTF("Cannot locate _BBN. Using default 0\n");
+			pcicfg.bus = 0;
+		} else {
+			AML_PRINTF("found _BBN: %d\n",
+				   pci_info->property->num.number);
+			pcicfg.bus = pci_info->property->num.number & 0xff;
+		}
+
+		/* Obtain device & function number */
+		pci_info = aml_search_name(env, "_ADR");
+		if (!pci_info || pci_info->property->type != aml_t_num) {
+			printf("Cannot locate: _ADR\n");
+			state = -1;
+			goto io_done;
+		}
+		pcicfg.slot = (pci_info->property->num.number >> 16) & 0xff;
+		pcicfg.func = pci_info->property->num.number & 0xff;
+
+		AML_PRINTF("[pci%d.%d.%d]",
+			   pcicfg.bus, pcicfg.slot, pcicfg.func);
+	}
 
 	/* simple I/O ? */
 	if (offsetlow == 0 && offsethigh == 0 &&
@@ -124,6 +164,9 @@
 					break;
 				}
 				break;
+			case 2:
+				value = pci_cfgread(&pcicfg, addr, bitlen/8);
+				break;
 			default:
 				printf("aml_region_io_system: not supported yet (%d)\n",
 				    regtype);
@@ -165,6 +208,9 @@
 					break;
 				}
 				break;
+			case 2:
+				pci_cfgwrite(&pcicfg, addr, value, bitlen/8);
+				break;
 			default:
 				printf("aml_region_io_system: not supported yet (%d)\n",
 				    regtype);
@@ -184,6 +230,9 @@
 		case 1:
 			val = OsdIn8(addr + i);
 			break;
+		case 2:
+			val = pci_cfgread(&pcicfg, addr + i, 1);
+			break;
 		default:
 			printf("aml_region_io_system: not supported yet (%d)\n",
 			    regtype);
@@ -252,6 +301,9 @@
 			case 1:
 				OsdOut8(addr + i, val);
 				break;
+			case 2:
+				pci_cfgwrite(&pcicfg, addr + i, val, 1);
+				break;
 			default:
 				printf("aml_region_io_system: not supported yet (%d)\n",
 				    regtype);
@@ -273,13 +325,13 @@
 }
 
 u_int32_t
-aml_region_read(int regtype, u_int32_t flags, u_int32_t addr,
-    u_int32_t bitoffset, u_int32_t bitlen)
+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)
 {
 	int	value;
 	int	state;
 
-	state = aml_region_io_system(AML_REGION_INPUT, regtype,
+	state = aml_region_io_system(env, AML_REGION_INPUT, regtype,
 	    flags, &value, addr, bitoffset, bitlen);
 	AML_SYSASSERT(state != -1);
 
@@ -287,19 +339,20 @@
 }
 
 int
-aml_region_read_into_buffer(int regtype, u_int32_t flags, u_int32_t addr,
-    u_int32_t bitoffset, u_int32_t bitlen, u_int8_t *buffer)
+aml_region_read_into_buffer(struct aml_environ *env, int regtype,
+    u_int32_t flags, u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen,
+    u_int8_t *buffer)
 {
 	return (0);
 }
 
 int
-aml_region_write(int regtype, u_int32_t flags, u_int32_t value,
-    u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen)
+aml_region_write(struct aml_environ *env, int regtype, u_int32_t flags,
+    u_int32_t value, u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen)
 {
 	int	state;
 
-	state = aml_region_io_system(AML_REGION_OUTPUT, regtype,
+	state = aml_region_io_system(env, AML_REGION_OUTPUT, regtype,
 	    flags, &value, addr, bitoffset, bitlen);
 	AML_SYSASSERT(state != -1);
 
@@ -307,17 +360,17 @@
 }
 
 int
-aml_region_write_from_buffer(int regtype, u_int32_t flags, u_int8_t *buffer,
-    u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen)
+aml_region_write_from_buffer(struct aml_environ *env, int regtype,
+    u_int32_t flags, u_int8_t *buffer, u_int32_t addr, u_int32_t bitoffset,
+    u_int32_t bitlen)
 {
 	return (0);
 }
 
 int
-aml_region_bcopy(int regtype, 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)
+aml_region_bcopy(struct aml_environ *env, int regtype,
+    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)
 {
 	return (0);
 }
diff -ru acpi/aml/aml_region.h.org acpi/aml/aml_region.h
--- acpi/aml/aml_region.h.org	Fri Jul 14 18:49:43 2000
+++ acpi/aml/aml_region.h	Fri Jul 21 08:55:52 2000
@@ -32,18 +32,21 @@
 /*
  * Region I/O subroutine
  */
+struct aml_environ;
 
-u_int32_t	 aml_region_read(int, u_int32_t, u_int32_t,
-				 u_int32_t, u_int32_t);
-int		 aml_region_write(int, u_int32_t, u_int32_t,
-				  u_int32_t, u_int32_t, u_int32_t);
-int		 aml_region_read_into_buffer(int, u_int32_t, u_int32_t,
-					     u_int32_t, u_int32_t, u_int8_t *);
-int		 aml_region_write_from_buffer(int, u_int32_t, u_int8_t *,
-					      u_int32_t, u_int32_t, u_int32_t);
-int		 aml_region_bcopy(int, u_int32_t, u_int32_t,
-				  u_int32_t, u_int32_t, u_int32_t,
-				  u_int32_t, u_int32_t, u_int32_t);
+u_int32_t	 aml_region_read(struct aml_environ *, int, u_int32_t,
+				 u_int32_t, u_int32_t, u_int32_t);
+int		 aml_region_write(struct aml_environ *, int, u_int32_t,
+				  u_int32_t, u_int32_t, u_int32_t, u_int32_t);
+int		 aml_region_read_into_buffer(struct aml_environ *, int,
+					     u_int32_t, u_int32_t, u_int32_t,
+					     u_int32_t, u_int8_t *);
+int		 aml_region_write_from_buffer(struct aml_environ *, int,
+					      u_int32_t, u_int8_t *, u_int32_t,
+					      u_int32_t, u_int32_t);
+int		 aml_region_bcopy(struct aml_environ *, int,
+				  u_int32_t, u_int32_t, u_int32_t, u_int32_t,
+				  u_int32_t, u_int32_t, u_int32_t, u_int32_t);
 
 #ifndef _KERNEL
 void	aml_simulation_regdump(const char *);
diff -ru acpi/aml/aml_store.c.org acpi/aml/aml_store.c
--- acpi/aml/aml_store.c.org	Fri Jul 14 18:49:44 2000
+++ acpi/aml/aml_store.c	Fri Jul 21 08:42:23 2000
@@ -77,7 +77,7 @@
 			AML_PRINTF("[write(From%d, 0x%x, 0x%x)]",
 			    or->space, obj->num.number,
 			    or->offset + field->bitoffset / 8);
-			aml_region_write(or->space, field->flags,
+			aml_region_write(env, or->space, field->flags,
 			    obj->num.number, or->offset,
 			    field->bitoffset, field->bitlen);
 			break;
@@ -89,8 +89,8 @@
 				buffer = obj->bfld.origin;
 				buffer += obj->bfld.bitoffset / 8;
 			}
-			aml_region_write_from_buffer(or->space, field->flags,
-			    buffer, or->offset, field->bitoffset,
+			aml_region_write_from_buffer(env, or->space,
+			    field->flags, buffer, or->offset, field->bitoffset,
 			    field->bitlen);
 			break;
 		case aml_t_regfield:
@@ -99,7 +99,7 @@
 					   "Different type of space\n");
 				break;
 			}
-			aml_region_bcopy(obj->regfield.space,
+			aml_region_bcopy(env, obj->regfield.space,
 			    obj->regfield.flags, obj->regfield.offset,
 			    obj->regfield.bitoffset, obj->regfield.bitlen,
 			    field->flags, or->offset, field->bitoffset,
@@ -161,7 +161,7 @@
 		if (bitlen > obj->regfield.bitlen) {
 			bitlen = obj->regfield.bitlen;
 		}
-		aml_region_read_into_buffer(obj->regfield.space,
+		aml_region_read_into_buffer(env, obj->regfield.space,
 		    obj->regfield.flags, obj->regfield.offset,
 		    obj->regfield.bitoffset, bitlen,
 		    buf->buffer.data + offset);
@@ -219,7 +219,7 @@
 			bcopy(srcbuf, buffer, bitlen / 8);
 			break;
 		case aml_t_regfield:
-			aml_region_read_into_buffer(src->regfield.space,
+			aml_region_read_into_buffer(env, src->regfield.space,
 			    src->regfield.flags, src->regfield.offset,
 			    src->regfield.bitoffset, src->regfield.bitlen,
 			    buffer);

----Next_Part(Sat_Jul_22_13:08:22_2000_809)----
