> > >
> >
> > If (\_OSI ("Windows 2006"))
> > {
> > Store (0x40, ^OSTB)
> > Store (0x40, ^TPOS)
> > }
> >
> > If (\_OSI ("Linux"))
> > {
> > Store (0x01, LINX)
> > Store (0x80, ^OSTB)
> > Store (0x80, ^TPOS)
> > }
> >
> > Like other Acers...
> > LINX is written but never read, a NOP
> > OSTB is compared to >=4 only, so the Linux branch above is a NOP
> > OSTP return value is never referneced, a NOP
> >
> > However, TPOS is referenced in the ATA _STM and _PS0 method,
> > wher it is compared equal to 0x40. OSI(Linux) will disable
> > that code (whatever it does).
> >
> > So unless you find the power management of your HDD to be better
> > with acpi_osi=Linux at suspend/resume time,
> > we'll stick with the default of acpi_osi=!Linux for all Acer.
> >
>
> Hmmmm what do you mean by "power management of your HDD". I got no
> problem with suspend/resume and I never use power management of HDD (as
> it seems that it is not really something that can help to enhance the
> lifetime of the harddisk).
In this case, it is invoked for you during suspend/resume.
> Is there a way to know what does this condition branch ?
The big picture is that if the box has a Vista sticker on it,
then it was validated with Vista, and why would Linux want to
run the BIOS through a (different) code path that was not validated?
But yes, one can read the code below and notice there is a hook in
SAT0.PRID._STM that only executes on Vista
(though curiously, _STM for the other 3 targets doesn't have this).
This hook does something to the PCI config space of the device.
and for all 4 targets, there is code under _PS0 - which is
what would be invoked on resume.
There is also some sort of spin on a busy-bit in the method
that restores power to the 4 SATA targets that executes
only if Vista compatible.
-Len
Device (SAT0)
Device (PRID)
{
Name (_ADR, 0x00)
Name (SPTM, Buffer (0x14)
{
/* 0000 */ 0x78, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00,
0x00,
/* 0008 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF,
/* 0010 */ 0x13, 0x00, 0x00, 0x00
})
Method (_GTM, 0, NotSerialized)
{
Return (SPTM)
}
Method (_STM, 3, NotSerialized)
{
Store (Arg0, SPTM)
If (LEqual (TPOS, 0x40))
{
# Vista compatible path
\_SB.PCI0.SMB.SAPW ()
}
}
Name (S12P, 0x00)
Method (_PS0, 0, NotSerialized)
{
If (LEqual (TPOS, 0x40))
{
# Vista compatible path
# looks like it spins on a busy bit in _PS0,
# the method used to bring the device back to powered-on
# non-vista will not spin on this bit
Store (0x28, Local0)
OperationRegion (SAI1, SystemIO, P3F4, 0x04)
Field (SAI1, ByteAcc, NoLock, Preserve)
{
Offset (0x01),
, 7,
BSY0, 1
}
While (LAnd (LEqual (BSY0, 0x01), Local0))
{
Store (Local0, DBGP)
Sleep (0xFA)
Decrement (Local0)
}
}
Store (0x00, S12P)
}
...
Device (SECD)
{
Name (_ADR, 0x01)
Name (SPTM, Buffer (0x14)
{
/* 0000 */ 0x78, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00,
0x00,
/* 0008 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF,
/* 0010 */ 0x13, 0x00, 0x00, 0x00
})
Method (_GTM, 0, NotSerialized)
{
Return (SPTM)
}
Method (_STM, 3, NotSerialized)
{
Store (Arg0, SPTM)
# note unconditional SAPW here, no check for Vista
\_SB.PCI0.SMB.SAPW ()
}
Name (S12S, 0x00)
Method (_PS0, 0, NotSerialized)
{
If (LEqual (TPOS, 0x40))
{
# Vista path, like pri target above
Store (0x28, Local2)
OperationRegion (SAI2, SystemIO, P1F4, 0x04)
Field (SAI2, ByteAcc, NoLock, Preserve)
{
Offset (0x01),
, 7,
BSY1, 1
}
While (LAnd (LEqual (BSY1, 0x01), Local2))
{
Sleep (0xFA)
Store (Local2, DBGP)
Decrement (Local2)
}
}
Store (0x00, S12S)
}
Device (SAT1)
Device (PRID)
# same SECD above
Device (SECD)
# same as SECD above
So what does SAPW() do?
Method (SAPW, 0, NotSerialized)
{
Acquire (SAPM, 0xFFFF)
Store (Z00W, Local0)
And (Local0, 0x01, Local1)
If (Local1)
{
\_SB.PCI0.SAT0.FBWK ()
Or (Z00W, 0x20, Z00W)
}
And (Local0, 0x10, Local1)
If (Local1)
{
\_SB.PCI0.SAT1.FBWK ()
Or (Z00W, 0x40, Z00W)
}
Release (SAPM)
}
...
Device (SMB)
{
Name (_ADR, 0x00140000)
OperationRegion (Z00V, PCI_Config, 0x08, 0x0100)
Field (Z00V, ByteAcc, NoLock, Preserve)
{
RVID, 8,
Offset (0xA5),
Z00W, 8,
# Z00W lives in PCI configuratioon space - no idea what it does
Offset (0xF0),
EIDX, 8,
Offset (0xF4),
EDAT, 32
}
...
Device (SAT0)
{
Name (_ADR, 0x00120000)
OperationRegion (SAP1, PCI_Config, 0x00, 0x44)
Field (SAP1, WordAcc, NoLock, Preserve)
{
Offset (0x08),
CLCD, 32,
Offset (0x10),
P1F0, 16,
Offset (0x14),
P3F4, 16,
Offset (0x18),
P170, 16,
Offset (0x1C),
P1F4, 16,
Offset (0x40),
CNFG, 8
# CNFG lives in PCI configuration space for the device
}
Method (FBWK, 0, NotSerialized)
{
And (CNFG, 0xF7, CNFG)
Sleep (0x0A)
And (CNFG, 0xEF, CNFG)
}
# presumably x1080 is a debug port
OperationRegion (\DEBG, SystemIO, 0x1080, 0x01)
Field (\DEBG, ByteAcc, NoLock, Preserve)
{
DBGP, 8
}
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html