Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Sep 2000 04:33:24 +0900
From:      Mitsuru IWASAKI <iwasaki@jp.FreeBSD.org>
To:        iwasaki@jp.freebsd.org
Cc:        takawata@shidahara1.planet.sci.kobe-u.ac.jp, haro@tk.kubota.co.jp, current@freebsd.org, acpi-jp@jp.freebsd.org
Subject:   Re: My system hang with ACPI kernel thread
Message-ID:  <20000929043324K.iwasaki@jp.FreeBSD.org>
In-Reply-To: <20000928193031R.iwasaki@jp.FreeBSD.org>
References:  <20000928101721L.haro@tk.kubota.co.jp> <200009280438.NAA63726@shidahara1.planet.sci.kobe-u.ac.jp> <20000928193031R.iwasaki@jp.FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi,

> > In message <20000928101721L.haro@tk.kubota.co.jp>, Munehiro Matsuda wrote:
> > 
> > >With the addition of ACPI kernel thread, my system hangs in about 
> > >10 miniutes use after boot up. By disabling kernel thread, system
> > >runs just fine.
> > >
> > >Do you have any idea where to look at?
> > >I'll try and see what I can do myself.
> > 
> > Please set debug.aml_debug and debug.acpi_debug to 1 and 
> > see what will happen.
> 
> I could find a couple of possibilities from VersaProNX.asl; lack of
> SleepOp or EC I/O.  If the former, I can try to write it as well as
> StallOp tonight, of course Intel ACPICA compatible one.

Ok, I've just wrote Stall() and Sleep() operators.  Differences
between them are short-term or long-term, not relinquish CPU or
relinquish CPU.  I used DELAY() for StallOp and tsleep() for SleepOp.
BTW, is timeout parameter of tsleep broken for now?  I had to call
wakeup() explicitly, otherwise it won't return from tsleep :-(

Index: dev/acpi/acpi.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/acpi/acpi.c,v
retrieving revision 1.14
diff -u -r1.14 acpi.c
--- dev/acpi/acpi.c	2000/09/27 05:43:53	1.14
+++ dev/acpi/acpi.c	2000/09/28 19:10:52
@@ -1707,5 +1707,51 @@
 
 SYSINIT(acpi, SI_SUB_KTHREAD_IDLE, SI_ORDER_ANY, acpi_start_threads, 0);
 
+/*
+ * System service interface
+ */
+
+#include <sys/proc.h>
+
+#if 1
+/* XXX tsleep timeout broken? */
+static void
+acpi_sleep_end(void *chan)
+{
+	wakeup(chan);
+}
+#endif
 
+int
+acpi_sleep(u_int32_t micro)
+{
+	int		x, error;
+	static u_int8_t	count = 0;
+
+	x = error = 0;
+
+	if (micro == 0) {
+		return (1);
+	}
+
+	if (curproc == NULL) {
+		return (2);
+	}
+
+#if 1
+/* XXX tsleep timeout broken? */
+	timeout(acpi_sleep_end, (caddr_t)acpi_sleep + count,
+	    (hz * micro) / 1000000L);
+#endif
+	error = tsleep((caddr_t)acpi_sleep + count, PWAIT, "acpislp", 
+	    (hz * micro) / 1000000L);
+	if (error != 0 && error != EWOULDBLOCK) {
+		return (2);
+	}
+	x = splhigh();
+	count++;
+	splx(x);
+
+	return (0);
+}
 
Index: dev/acpi/acpi.h
===================================================================
RCS file: /home/ncvs/src/sys/dev/acpi/acpi.h,v
retrieving revision 1.10
diff -u -r1.10 acpi.h
--- dev/acpi/acpi.h	2000/09/27 05:43:54	1.10
+++ dev/acpi/acpi.h	2000/09/28 19:25:37
@@ -163,4 +163,9 @@
 #define ACPI_DEVPRINTF(args...)		printf("acpi0: " args)
 #define ACPI_DEBUGPRINT(args...)	do { if (acpi_debug) ACPI_DEVPRINTF(args);} while(0)
 
+/*
+ * System service interface
+ */
+extern int	acpi_sleep(u_int32_t micro);
+
 #endif	/* !_DEV_ACPI_ACPI_H_ */
Index: dev/acpi/aml/aml_common.h
===================================================================
RCS file: /home/ncvs/src/sys/dev/acpi/aml/aml_common.h,v
retrieving revision 1.2
diff -u -r1.2 aml_common.h
--- dev/acpi/aml/aml_common.h	2000/09/20 01:01:27	1.2
+++ dev/acpi/aml/aml_common.h	2000/09/28 18:17:27
@@ -47,11 +47,15 @@
 	printf(fmt, args);						\
 } while(0)
 #define AML_DEBUGGER(x, y)	/* no debugger in kernel */
+#define AML_STALL(micro)	DELAY(micro)
+#define AML_SLEEP(sec, milli)	OsdSleep(sec, milli)
 #else /* !_KERNEL */
 #define AML_SYSASSERT(x)	assert(x)
 #define AML_SYSABORT()  	abort()
 #define AML_SYSERRX(eval, fmt, args...)	errx(eval, fmt, args)
 #define AML_DEBUGGER(x, y)	aml_dbgr(x, y)
+#define AML_STALL(m)		/* not required in userland */
+#define AML_SLEEP(s, m)		/* not required in userland */
 #endif /* _KERNEL */
 
 union	aml_object;
Index: dev/acpi/aml/aml_parse.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/acpi/aml/aml_parse.c,v
retrieving revision 1.3
diff -u -r1.3 aml_parse.c
--- dev/acpi/aml/aml_parse.c	2000/09/20 22:53:39	1.3
+++ dev/acpi/aml/aml_parse.c	2000/09/28 11:40:44
@@ -55,6 +55,8 @@
 #include "debug.h"
 #else /* _KERNEL */
 #include <sys/systm.h>
+#include <machine/acpica_osd.h>
+#include <machine/clock.h>
 #endif /* !_KERNEL */
 
 static int		 findsetleftbit(int num);
@@ -1484,14 +1486,18 @@
 			aml_parse_termobj(env, indent);
 			AML_DEBUGPRINT(")");
 			break;
-		case 0x21:	/* StallOp *//* XXX Not yet */
+		case 0x21:	/* StallOp */
 			AML_DEBUGPRINT("Stall(");
-			aml_parse_termobj(env, indent);
+			num1 = aml_objtonum(env, aml_eval_name(env,
+			    aml_parse_termobj(env, indent)));
 			AML_DEBUGPRINT(")");
+			AML_STALL(num1);
 			break;
-		case 0x22:	/* SleepOp *//* XXX Not yet */
+		case 0x22:	/* SleepOp */
 			AML_DEBUGPRINT("Sleep(");
-			aml_parse_termobj(env, indent);
+			num1 = aml_objtonum(env, aml_eval_name(env,
+			    aml_parse_termobj(env, indent)));
+			AML_SLEEP(0, num1);
 			AML_DEBUGPRINT(")");
 			break;
 		case 0x23:	/* AcquireOp *//* XXX Not yet */
Index: i386/include/acpica_osd.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/include/acpica_osd.h,v
retrieving revision 1.4
diff -u -r1.4 acpica_osd.h
--- i386/include/acpica_osd.h	2000/09/02 15:06:54	1.4
+++ i386/include/acpica_osd.h	2000/09/28 19:30:05
@@ -38,6 +38,8 @@
 #include <vm/vm.h>
 #include <vm/pmap.h>
 
+#include <dev/acpi/acpi.h>
+
 #include "pcib_if.h"
 
 /*
@@ -317,3 +319,42 @@
 {
 	return (OsdWritePciCfg(Bus, DeviceFunction, Register, Value, 4));
 }
+
+#ifndef ACPI_NO_OSDFUNC_INLINE
+static __inline
+#endif
+ACPI_STATUS
+OsdSleepUsec(UINT32 Microseconds)
+{
+	int		error;
+	ACPI_STATUS	status;
+
+	error = acpi_sleep(Microseconds);
+	switch (error) {
+	case 0:
+		/* The running thread slept for the time specified */
+		status = AE_OK;
+		break;
+	case 1:
+		/* TBD!!!! */
+		status = AE_BAD_PARAMETER;
+		break;
+	case 2:
+	default:
+		/* The running thread did not slept because of a host OS error */
+		status = AE_ERROR;
+		break;
+	}
+
+	return (status);
+}
+
+#ifndef ACPI_NO_OSDFUNC_INLINE
+static __inline
+#endif
+ACPI_STATUS
+OsdSleep(UINT32 Seconds, UINT32 Milliseconds)
+{
+	return OsdSleepUsec(Seconds * 1000000L + Milliseconds * 1000);
+}
+
Index: sys/acpi.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/acpi.h,v
retrieving revision 1.2
diff -u -r1.2 acpi.h
--- sys/acpi.h	2000/08/29 20:30:54	1.2
+++ sys/acpi.h	2000/09/28 19:23:54
@@ -314,6 +314,9 @@
 ACPI_STATUS	 OsdWritePciCfgByte(UINT32, UINT32 , UINT32 , UINT8);
 ACPI_STATUS	 OsdWritePciCfgWord(UINT32, UINT32 , UINT32 , UINT16);
 ACPI_STATUS	 OsdWritePciCfgDword(UINT32, UINT32 , UINT32 , UINT32);
+
+ACPI_STATUS	 OsdSleep(UINT32, UINT32);
+ACPI_STATUS	 OsdSleepUsec(UINT32);
 #endif	/* ACPI_NO_OSDFUNC_INLINE */
 
 #else	/* !_KERNEL */


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?20000929043324K.iwasaki>