> Date: Mon, 6 Apr 2020 15:32:09 -0500 > From: Scott Cheloha <scottchel...@gmail.com> > > On Tue, Mar 24, 2020 at 09:02:38PM +0100, Mark Kettenis wrote: > > > Date: Tue, 24 Mar 2020 12:52:55 -0500 > > > From: Scott Cheloha <scottchel...@gmail.com> > > > > > > On Tue, Mar 24, 2020 at 09:17:34AM +0100, Mark Kettenis wrote: > > > > > Date: Mon, 23 Mar 2020 21:57:46 -0500 > > > > > From: Scott Cheloha <scottchel...@gmail.com> > > > > > > > > > > On Sun, Mar 15, 2020 at 09:55:53PM -0500, Scott Cheloha wrote: > > > > > > > > > > > > [...] > > > > > > > > > > > > This is a straightforward ticks-to-milliseconds conversion, but IIRC > > > > > > pirofti@ wanted me to get some tests before committing it. > > > > > > > > > > > > The only users of acpi_sleep() are (a) acpitz(4) and (b) any AML > > > > > > code > > > > > > that uses AMLOP_SLEEP. AMLOP_SLEEP seems to trigger just before a > > > > > > suspend. I don't know when else it is used. > > > > > > > > > > > > If you have an acpi(4) laptop with suspend/resume support, please > > > > > > apply this patch and let me know if anything doesn't work, > > > > > > particularly with suspend/resume. > > > > > > > > > > > > [...] > > > > > > > > > > 1 week bump. > > > > > > > > > > I have one test report. I'm hoping for a few more. > > > > > > > > > > I think acpi(4) machines with suspend/resume support should be > > > > > somewhat common amongst tech@ readers. > > > > > > > > AMLOP_SLEEP can occur anywhere when executing AML code. > > > > > > Oh, good to know. > > > > > > > The current code tries to protect against negative timeouts, but > > > > your new code doesn't? > > > > > > What would a negative value here actually mean? A firmware bug? > > > Should we log that? Or panic? > > > > > > The simplest thing would be to just MAX it up to 1. Which I have > > > done in this patch. > > > > > > But it looks like there are other "what if we get a negative value > > > from the firmware" problems in this file. I dunno if you want to > > > address all of them. > > > > > > Related: > > > > > > I'm looking around at these functions accepting .v_integer as > > > argument: acpi_stall, acpi_sleep(), acpi_event_wait(). They all take > > > ints, but aml_value.v_integer is an int64_t. So there's implicit > > > type-casting. > > > > > > Should we change these functions to handle 64-bit integers? Or should > > > we clamp .v_integer to within [INT_MIN, INT_MAX]? > > > > The ACPI code isn't the best code in our tree I fear. One issue here > > is that ACPI 1.0 had 32-bit integers, which became 640-bit in ACPI > > 2.0. Treating all integers as 64-bit numbers seems to work fine > > though. So acpi_sleep() should really accept a 64-bit integer as an > > argument. And ACPI says that integers are unsigned, so the sign > > problem should never occur and our codebase is just plain doing it > > wrong... > > > > Here is the description of the operation lifted form the ACPI 6.3 spec: > > > > 19.6.125 Sleep (Milliseconds Sleep) > > > > Syntax > > > > Sleep (MilliSeconds) > > > > Arguments > > > > The Sleep term is used to implement long-term timing > > requirements. Execution is delayed for at least the required > > number of milliseconds. > > > > Description > > > > The implementation of Sleep is to round the request up to the > > closest sleep time supported by the OS and relinquish the > > processor. > > That sounds like a much deeper problem. > > The following diff converts the tsleep(9) to tsleep_nsec(9) without > changing the current behavior. I have left a note about the larger > problem. > > I have several successful test reports. > > Is anyone OK with this?
ok kettenis@ > Index: dsdt.c > =================================================================== > RCS file: /cvs/src/sys/dev/acpi/dsdt.c,v > retrieving revision 1.249 > diff -u -p -r1.249 dsdt.c > --- dsdt.c 16 Oct 2019 01:43:50 -0000 1.249 > +++ dsdt.c 6 Apr 2020 20:29:51 -0000 > @@ -465,15 +465,14 @@ void > acpi_sleep(int ms, char *reason) > { > static int acpinowait; > - int to = ms * hz / 1000; > + > + /* XXX ACPI integers are supposed to be unsigned. */ > + ms = MAX(1, ms); > > if (cold) > delay(ms * 1000); > - else { > - if (to <= 0) > - to = 1; > - tsleep(&acpinowait, PWAIT, reason, to); > - } > + else > + tsleep_nsec(&acpinowait, PWAIT, reason, MSEC_TO_NSEC(ms)); > } > > void >