>So, before I begin that search, which THM0 methods can I safely get
>rid of? All of AC0M, AC1M, PSL, TC1, TC2, TSP, TBL0, MODP, _CRT, AL0,
>PSL? That'll leave MODE, _TMP, _AC0, _SCP, PSV to bisect among.
for example, I would fake these methods in this way:
Method (_TMP, 0, NotSerialized)
{
Return (0x0BB8)
}
Method (_PSV, 0, NotSerialized)
{
Return (0)
}
Execute Method: [\_TZ_.THM0._TMP] (Node c157bf88)
Execute Method: [\_TZ_.THM0._PSV] (Node c157be48)
Execute Method: [\_TZ_.THM0._TC1] (Node c157bdc8)
Execute Method: [\_TZ_.THM0._TC2] (Node c157bd88)
Execute Method: [\_TZ_.THM0._TSP] (Node c157bd48)
Execute Method: [\_TZ_.THM0._AC0] (Node c157bf48)
Execute Method: [\_TZ_.THM0._SCP] (Node c157bec8)
Execute Method: [\_TZ_.THM0._TMP] (Node c157bf88)
Your intuition was right. Testing by changing only the DSDT gives
slightly different results than by changing the kernel drivers. So
far the results:
with only THM0 in the DSDT: HANGS (but only on the second sleep, not
the first one, so a slight difference with the kernel-testing data)
with only THM0 and all methods doing nothing (either returning 0 or,
for _TMP, 0xBB8): NO hang
with only THM0 and all methods except _TMP doing nothing, but _TMP
doing its normal code: NO hang [that's the difference between DSDT
and kernel testing]
More bisection coming.
-Sanjoy
`Never underestimate the evil of which men of power are capable.'
--Bertrand Russell, _War Crimes in Vietnam_, chapter 1.
Here the test results on the DSDT variants, as a tree. THM0 is the
root (meaning a DSDT with only THM0). -XYZ means 'fake the method XYZ
in THM0, relative to the situation in the parent DSDT':
hang: THM0
okay: -TMP
hang: -PSV
okay: -AC0 (i.e. THM0 methods but no PSV, no AC0)
hang: -SCP
hang: -AC0
The first two results are consistent with the view that TMP is the
problem.
>From the first five results, I convinced myself that TMP needed AC0
around to cause a problem, and vice versa: hang iff (TMP & AC0). But
the last result (-AC0) surprised me. Now I think:
hang iff (TMP & (PSV | AC0)).
The -PSV-AC0 DSDT, which did not hang, seemed close to hanging. After
a few cycles, it became very sluggish and the load was 8.2 on wakeup.
But the sluggishness disappeared after a couple more cycles, and I
couldn't produce a hang (tried two reboots, each with different
permutations of sleep.sh or "echo 1 > THM0/polling_frequency").
The -AC0 DSDT hung upon doing
echo 1 > THM0/polling_frequency ; sleep.sh; sleep.sh
and it got in an endless loop that showed it sluggishly executing
(over and over again) THM0._TMP.
It's probably not coincidence that TMP and AC0 both use the EC.
Although PSV doesn't.
I didn't make any tests on the MODP method. And the TC1, TC2, and TSP
methods seemed to trivial (just returning a constant) that it didn't
seem worth testing them.
I keep the kernels around for each permutation, so I can retest any of
the above, or send the THM0 portions of the .dsl files.
-Sanjoy
`Never underestimate the evil of which men of power are capable.'
--Bertrand Russell, _War Crimes in Vietnam_, chapter 1.
I started subdividing the _TMP method, and found that
hangs: -AC0 (as reported in the last email)
okay: -AC0-TMP (also in last email)
but
okay: -AC0-one line of TMP, by which I mean getting rid of the
EC0.UPDT() line below:
Method (_TMP, 0, NotSerialized)
{
\_SB.PCI0.ISA0.EC0.UPDT ()
Store (\_SB.PCI0.ISA0.EC0.TMP0, Local0)
If (LGreater (Local0, 0x0AAC))
{
Return (Local0)
}
Else
{
Return (0x0BB8)
}
}
So that's a small change in which having a line means the hang
happens, and not having the line means it goes away.
By the way, I just checked -AC0-TMP and it was okay (no hang). That
data point is consistent with TMP & (PSV | AC0).
> I found the common code in _PSV and _AC0
> Store (DerefOf (Index (DerefOf (MODP (0x01)), Local1)), Local0)
> Could you just comment out that?
I will try that right now (leaving TMP as in the vanilla DSDT).
-Sanjoy
`Never underestimate the evil of which men of power are capable.'
--Bertrand Russell, _War Crimes in Vietnam_, chapter 1.