On Thu, May 17, 2012 at 4:56 PM, Paul Hartman
<[email protected]> wrote:
> [ 6286.707038] ACPI Error: Method parse/execution failed
> [\_SB_.PCI0.PIB_.EC0_.SMWR] (Node ffff88007d028348),
> AE_AML_INFINITE_LOOP (20120111/psparse-536)
> [ 6286.707074] ACPI Error: Method parse/execution failed
> [\_SB_.PCI0.PIB_.EC0_.SMSL] (Node ffff88007d028398),
> AE_AML_INFINITE_LOOP (20120111/psparse-536)
> [ 6286.707096] ACPI Error: Method parse/execution failed
> [\_SB_.PCI0.PIB_.EC0_._Q09] (Node ffff88007d028438),
> AE_AML_INFINITE_LOOP (20120111/psparse-536)

After much trial and error, Googling, reading DSDT for other laptops,
and traversing archive.org for old web pages that no longer exist, I
think I have figured it out.

In the errors above the method SMWR has the real problem, the others
shown afterward were the callers and victims of the infinite loop
detection in kernel. In the disassembled code for the SMWR method
there is a while loop that looks like it could be the cause of an
infinite loop:

     And (SMST, 0x40, SMST)
     Store (Arg2, SMCM)
     Store (Arg1, SMAD)
     Store (Arg0, SMPR)
     While (LNot (And (SMST, 0xBF, Local1)))
     {
          Sleep (0x02)
     }

This exact same infinite loop condition happened in 2 different
methods in my DSDT, both of which gave me ACPI errors and caused
battery levels to stop working.

After making the change like the one shown below to these two while
loops, I have not yet encountered an infinite loop error and my
battery reading appears to work properly. Uptime of 2 hours with no
ACPI errors yet!

    And (SMST, 0x40, SMST)
    Store (Arg2, SMCM)
    Store (Arg1, SMAD)
    Store (Arg0, SMPR)
    Store (0x00, Local3)
    While (LNot (And (SMST, 0xBF, Local1)))
    {
        Sleep (0x02)
        Increment (Local3)
        If (LEqual (Local3, 0x32))
        {
                And (SMST, 0x40, SMST)
                Store (Arg2, SMCM)
                Store (Arg1, SMAD)
                Store (Arg0, SMPR)
                Store (0x00, Local3)
        }
    }

Reply via email to