From owner-freebsd-current Thu Sep 28 12:35:10 2000 Delivered-To: freebsd-current@freebsd.org Received: from tasogare.imasy.or.jp (tasogare.imasy.or.jp [202.227.24.5]) by hub.freebsd.org (Postfix) with ESMTP id 046DF37B42C for ; Thu, 28 Sep 2000 12:34:12 -0700 (PDT) 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 e8SJY4r44407; Fri, 29 Sep 2000 04:34:04 +0900 (JST) (envelope-from 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 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> X-Mailer: Mew version 1.94.1 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-Id: <20000929043324K.iwasaki@jp.FreeBSD.org> Date: Fri, 29 Sep 2000 04:33:24 +0900 From: Mitsuru IWASAKI X-Dispatcher: imput version 20000228(IM140) Lines: 238 Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG 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 + +#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 +#include +#include #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 #include +#include + #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