[coreboot] ACPI: Implementation of the _WAK method in e. g. Google Butterfly

Paul Menzel paulepanter at users.sourceforge.net
Tue Feb 19 00:26:20 CET 2013


Dear coreboot folks,


looking into the patch »Persimmon FWTS update: Fix FWTS S3 test.« [1] I
read up on the ACPI `_WAK` (System Wake) method (section 7.3.7 in ACPI
4.0a specification [2]).

        ### Return Value:
        A Package containing two Integers containing status and the power supply S-state
        
        ### Return Value Information
        _WAK returns a package with the following format:
        
        • Element 0 – An Integer containing a bitfield that represents conditions that occurred during sleep.
        0x00000000 – Wake was signaled and was successful
        0x00000001 – Wake was signaled but failed due to lack of power
        0x00000002 – Wake was signaled but failed due to thermal condition
        Other values – Reserved
        
        • Element 1 – An Integer containing the power supply S-state.
        If non-zero, this is the effective S-state the power supply that was actually entered. This value is used
        to detect when the targeted S-state was not entered because of too much current being drawn from the
        power supply. For example, this might occur when some active device’s current consumption pushes
        the system’s power requirements over the low power supply mark, thus preventing the lower power
        mode from being entered as desired.

So first question is, what is, when Element 1 is set to 0?

I was surprised to see, that the recent-Intel chip based boards like
Google Parrot or Butterfly just return a package with both elements set
to zero without any further checks. The AMD boards did the same(?), but
according to the above patch [1] this causes issues with Ubuntu’s
Firmware Test Suite [3].

        $ more src/mainboard/google/butterfly/acpi/platform.asl
        […]
        /* The _WAK method is called on system wake-up */

        Method(_WAK,1)
        {
        	/* Update in case state changed while asleep */
        	/* Update AC status */
        	Store (\_SB.PCI0.LPCB.EC0.ADPT, Local0)
        	if (LNotEqual (Local0, \PWRS)) {
        		Store (Local0, \PWRS)
        		Notify (\_SB.PCI0.LPCB.EC0.AC, 0x80)
        	}

        	/* Update LID status */
        	Store (\_SB.PCI0.LPCB.EC0.LIDF, Local0)
        	if (LNotEqual (Local0, \LIDS)) {
        		Store (Local0, \LIDS)
        		Notify (\_SB.LID0, 0x80)
        	}

        	Return(Package(){0,0})
        }

If I am not mistaken that contradicts the ACPI specification. Errors
during resume (Element 0) are not considered and neither is the power
supply.

I guess it is not deemed to be worth it to implement that. But could
such assumptions (and consequences(?)) please be documented in the code?

Or what am I missing?


Thanks,

Paul


[1] http://review.coreboot.org/#/c/2444/
[2] http://www.acpi.info/spec40a.htm
[3] https://wiki.ubuntu.com/Kernel/Reference/fwts/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part
URL: <http://www.coreboot.org/pipermail/coreboot/attachments/20130219/c950a107/attachment-0001.sig>


More information about the coreboot mailing list