From owner-acpi-jp@jp.freebsd.org  Fri Dec 10 02:37:45 1999
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id CAA18391;
	Fri, 10 Dec 1999 02:37:45 +0900 (JST)
	(envelope-from owner-acpi-jp@jp.FreeBSD.org)
Received: from light.imasy.or.jp (root@light.imasy.or.jp [202.227.24.4])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id CAA18386
	for <acpi-jp@jp.freebsd.org>; Fri, 10 Dec 1999 02:37:45 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from tasogare.imasy.or.jp (daemon@tasogare.imasy.or.jp [202.227.24.5])
	by light.imasy.or.jp (8.9.3+3.2W/3.7W-light) with ESMTP id CAA17376
	for <acpi-jp@jp.freebsd.org>; Fri, 10 Dec 1999 02:37:44 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from localhost (isdnb38.imasy.or.jp [202.227.24.166])
	by tasogare.imasy.or.jp (8.9.3+3.2W/3.7W-tasogare/smtpfeed 1.01) with ESMTP id CAA08285
	for <acpi-jp@jp.freebsd.org>; Fri, 10 Dec 1999 02:37:42 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Message-Id: <199912091737.CAA08285@tasogare.imasy.or.jp>
To: acpi-jp@jp.freebsd.org
In-Reply-To: Your message of "Fri, 10 Dec 1999 01:54:59 +0900"
	<199912091654.BAA06660@shidahara1.planet.sci.kobe-u.ac.jp>
References: <199912091654.BAA06660@shidahara1.planet.sci.kobe-u.ac.jp>
X-Mailer: Mew version 1.93 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Date: Fri, 10 Dec 1999 02:37:40 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 980905(IM100)
Lines: 255
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+990727
X-Sequence: acpi-jp 159
Subject: [acpi-jp 159] Re: acpiconf enhancement 
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

$B$^$!$3$l$O!"(BASL $B$N=PNO$r$A$g$C$H$-$l$$$K$7$^$7$g$&$+!"$0$i$$$N(B
$BOC$J$N$GM%@hEY$ODc$$$G$9!#(B

> >parse $B$7$J$,$i$$$-$J$j=PNO$9$k8=>u$NJ}<0$OFq$7$$LL$,$"$k(B
> >($BFC$K(B method) $B$H$$$&M}2r$J$N$G!":G=i$K(B namespace $B9=C[$7$F$6$C$/$j(B
> >parse $B$7$F$+$i=PNO$H$$$&OC$J$N$G$9!#(B
> 
> $B$=$l$OJ,$+$j$^$9$,(B.....acpiconf$B$K$=$N5!G=$^$GIU$1$A$c$&$s$G$9$+!)(B

$B$I$C$A$G$b$$$$$H;W$$$^$9!#$?$@$7!"(Bacpiconf $B$G@0M}$7$?=hM}$d(B
$B%G!<%?9=B$$rMxMQ$7$?7A$G<BAu$7$?J}$,8e!93Z$G$9$M!#(B
$BJ,N%$9$k$H$7$?$i!"6&DLItJ,$r%i%$%V%i%j2=$7$?J}$,$$$$$H;W$$$^$9!#(B

> $B$o$?$7$c!"(Bmethod$B8F=P$G(Bacpitest$B$N$[$&$OJQ$J=j$O4pK\E*$K$OF,$NCf$G(B
> $B=$@5$G$-$k$+$iNI$$$H;W$C$F$^$7$?$1$I(B.....$B$d$C$Q$jBLL\(B?(<-$BBLL\$K7h$^$C$F$k(B)

$B:G=*E*$K$O$d$j$?$$(B :)

> >$B$5$7$"$?$C$F$OF1$8G'<1$G$9!#$?$@N`;w$N5!G=$r;}$D(B 3$BK\$N(B utillity $B$r(B
> >$BJ]<i$7$F$$$/:#8e$NO+NO$r9M$($k$H!"$*$$$7$$$H$3$I$j$7$F0l$D$K(B
> >$B$^$H$a$?J}$,$$$$$G$9$h$M!#(B
> 
> $B$o$?$7$c%$%s%?!<%W%j%?$K<g4c$,8~$$$F$$$k$s$G$9$1$I!#(B

$B$b$A$m$s$=$l$G$$$$$H;W$$$^$9!#$H$$$&$+!"$\$/$b$=$&$G$9!#(B

> $B$H$$$&$3$H$G!"%a%=%C%I8F=P$rC)$C$F(Bparse$B$9$k$h$&$K$7$F$_$^$7$?!#(B
> $B$^$@!"$=$NB>$N@)8f9=B$JB$S$K!"%*%V%8%'%/%H$X$N(Bstore$B$d!"%G!<%?%*%V%8%'%/%H(B
> $B0J30$+$i$N%G!<%?%*%V%8%'%/%H$N<hF@$O<BAu$5$l$F$$$J$$$N$G(B
> $B$^$@$^$@;H$($^$;$s$,(B....

$B$r$r!"8e$G$_$F$_$^$9!#(B
$B$*JV$7$K(B acpiconf [-e] [-d] [-s sleep_type] [-f dsdt_file]
$B$N%Q%C%A$G$9!#(B

Index: parse.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/parse.c,v
retrieving revision 1.8
diff -u -r1.8 parse.c
--- parse.c	1999/12/08 14:17:01	1.8
+++ parse.c	1999/12/09 17:10:39
@@ -39,6 +39,7 @@
 #include "amlmem.h"
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 struct aml_environ {
 	u_int8_t       *dp;
 	u_int8_t       *end;
@@ -1808,14 +1809,7 @@
 	for (ptr = aname->child; ptr; ptr = ptr->brother)
 		showtree(ptr, lev + 1);
 }
-void
-command(struct aml_environ * env)
-{
-	showtree(env->curname, 0);
-	memman_statistics(aml_memman);
-	acpi_free_childname(get_rootname());
-	memman_statistics(aml_memman);
-}
+
 static void
 acpi_handle_dsdt(struct ACPIsdt * dsdp)
 {
@@ -1830,10 +1824,13 @@
 	env.dp = (u_int8_t *) dsdp->body;
 	env.end = (u_int8_t *) dsdp + dsdp->len;
 	env.curname = get_rootname();
-	command(&env);
+
+	showtree(env.curname, 0);
+	memman_statistics(aml_memman);
 }
+
 int
-realmemmain(int argc, char **argv)
+parse_dsdt()
 {
 	struct ACPIrsdp *rp = acpi_find_rsd_ptr();
 	struct ACPIsdt *rsdp;
@@ -1850,17 +1847,16 @@
 	acpi_handle_rsdt(rsdp);
 	return 0;
 }
+
 int
-main(int argc, char *argv[])
+load_dsdt(char *dsdtfile)
 {
 	struct aml_environ env;
 	u_int8_t       *code;
 	struct stat     sb;
 	int             fd;
-	if (argc <= 1) {
-		return realmemmain(argc, argv);
-	}
-	fd = open(argv[1], O_RDONLY, 0);
+
+	fd = open(dsdtfile, O_RDONLY, 0);
 	if (fd == -1) {
 		perror("open");
 		exit(-1);
@@ -1883,6 +1879,149 @@
 	env.dp = code;
 	env.end = code + sb.st_size;
 	env.curname = get_rootname();
-	command(&env);
+
+	showtree(env.curname, 0);
+	memman_statistics(aml_memman);
+	return 0;
+}
+
+#define ACPIDEV	"/dev/acpi"
+
+int
+acpi_enable()
+{
+	int fd = open(ACPIDEV, O_RDWR);
+	if (fd == -1)
+		err(1, NULL);
+
+	if (ioctl(fd, ACPIIO_ENABLE, NULL) == -1)
+		err(1, NULL);
+
+	close(fd);
+
+	return 0;
+}
+
+int
+acpi_disable()
+{
+	int fd = open(ACPIDEV, O_RDWR);
+	if (fd == -1)
+		err(1, NULL);
+
+	if (ioctl(fd, ACPIIO_DISABLE, NULL) == -1)
+		err(1, NULL);
+
+	close(fd);
+
+	return 0;
+}
+
+#if 1
+int
+acpi_setslpstatepkg()
+{
+	struct acpi_system_state_package ssp;
+	struct aml_name	*aname;
+	union aml_object *obj;
+	char	_sxstr[5];
+	int	i;
+	int fd = open(ACPIDEV, O_RDWR);
+
+	if (fd == -1)
+		err(1, NULL);
+	
+	bzero(&ssp, sizeof(struct acpi_system_state_package));
+	for (i = 0; i < 6; i++) {
+		sprintf(_sxstr, "_S%d_", i);
+		if ((aname = search_aml_name(get_rootname(), _sxstr)) == NULL) {
+			goto unsupported;
+		}
+
+		obj = aname->property;
+		if ((obj->type != aml_t_package) || (obj->package.elements < 2)) {
+			goto unsupported;
+		}
+
+		if (obj->package.objects[0]->type != aml_t_num ||
+		    obj->package.objects[1]->type != aml_t_num) {
+			goto unsupported;
+		}
+
+
+		ssp.mode[i].slp_typ_a = obj->package.objects[0]->num.number;
+		ssp.mode[i].slp_typ_b = obj->package.objects[1]->num.number;
+		continue;
+unsupported:
+		ssp.mode[i].slp_typ_a = ACPI_UNSUPPORTSLPTYP;
+		ssp.mode[i].slp_typ_b = ACPI_UNSUPPORTSLPTYP;
+		continue;
+	}
+
+	if (ioctl(fd, ACPIIO_SETSLPSTATEPKG, &ssp) == -1)
+		err(1, NULL);
+
+	close(fd);
+
+	return 0;
+}
+#endif
+
+int
+acpi_sleep(int sleep_type)
+{
+	int fd = open(ACPIDEV, O_RDWR);
+	if (fd == -1)
+		err(1, NULL);
+
+	if (sleep_type < 0 || sleep_type > 7) {
+		fprintf(stderr, "invalid sleep type (%d)\n", sleep_type);
+		return -1;
+	}
+
+	if (ioctl(fd, ACPIIO_SETSLPSTATE, &sleep_type) == -1)
+		err(1, NULL);
+
+	close(fd);
+
+	return 0;
+}
+
+int
+main(int argc, char *argv[])
+{
+	char		c;
+
+	if (argc == 1) {
+		parse_dsdt();
+		goto out;
+	}
+
+	while ((c = getopt(argc, argv, "f:s:ed")) != -1) {
+		switch (c) {
+		case 'e':
+			return acpi_enable();
+		case 'd':
+			return acpi_disable();
+		case 's':
+			parse_dsdt();
+#if 1
+			acpi_setslpstatepkg();
+#endif
+			acpi_sleep(*optarg - '0');
+			break;
+		case 'f':
+			load_dsdt(optarg);
+			break;
+		default:
+			argc -= optind;
+			argv += optind;
+		}
+	}
+
+out:
+	acpi_free_childname(get_rootname());
+	memman_statistics(aml_memman);
+
 	return 0;
 }
