RE: 2.6.16 not booting due to ACPI revision 20060127

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I believe that we must run _STA in order to determine whether the device is present or not and whether to continue initialization of the device children.

Thus, the patch given is essentially correct.




-----Original Message-----
From: xb [mailto:xavier.bru@xxxxxxxx] 
Sent: Tuesday, April 04, 2006 1:24 AM
To: Brown, Len; Moore, Robert; Luck, Tony; linux-acpi@xxxxxxxxxxxxxxx; Therien, Guy
Cc: linux-ia64@xxxxxxxxxxxxxxx
Subject: Re: 2.6.16 not booting due to ACPI revision 20060127

Hi Robert and len,

Thanks for answering my mail.
I think that the problem is that we execute methods on the hot plug controler for an unexisting bus. 
There is a method that loops on a particular field:

000065f3:  04 -------- Method WSOB
000065f9:  05 . . . . .  0x00
000065fa:  05 . . . . .  While
000065fc:  06 . . . . . .  SOBO
00006600:  06 . . . . . .  Noop

I put, attached a partial trace of the called methods, and a dump of the DSDT.
Thanks again.

Brown, Len wrote: 
We have platforms that do not boot in 2.6.16, but boot OK with 2.6.15 
(loop in ACPI code).
    

Sounds like it wouldn't have booted any of the 2.6.16 pre-release
candidates either...

  
Yes.

After some investigations, I found this is due to pci buses that are 
described in the configuration, but not available in limited 
configurations.
    

  
These buses have a _STA method, but no _INI method.
With 2.6.15, the _STA method is run, and as the bus is not 
present, the bus and all devices behind it are ignored.
    

The non-present busses should still be ignored in 2.6.16,
independent of the STA/INI optimization.

  
How can this be done if we do not run the STA method ?

With 2.6.16, as no _INI method is provided for the bus, _STA method is 
not run, and then we loop when executing methods for devices 
behind the not present bus.
    

Need to find out what methods are looping on non-existent
devices, and why STA didn't prevent that.  This is probably
independent of the STA/INI optimization in 20060127.

  
As described earlier, we loop in WSOB method for hotplug controler for unexisting bus...

It sounds like either
1. we're not evaluating _STA someplace in the bus enumeration code
   when we should be, and perhaps this was masked in 2.6.15 when
   we blindly evaluated STA everywhere.

   I'll venture that is the issue here -- the STA/INI optimization
   has unmasked a Linux bug.  Note that the patch to
   again blindly execute STA everwhere would simply re-mask the bug,
   rather than fixing it directly.
or

2. _STA on this box is somehow special and has side effects.

  

Please open a bugzilla here:
http://bugzilla.kernel.org/enter_bug.cgi?product=ACPI

and attach the output from acpidump
acpidump is available in the latest pmtools here:
http://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/


  
OK, I will do that.

Having a look to ACPI specification, I could find nowhere the 
restriction that _STA method is called only when an _INI method is 
provided for the device:

"6.5.1 _INI (Init)
...
If the _STA method indicates that the device is present, OSPM will 
evaluate the _INI for the device (if the _INI method exists) and will 
examine each of the children of the device for _INI methods. 
If the _STA 
method indicates that the device is not present, OSPM will not run the 
_INI and will not examine the children of the device for _INI 
methods. "
    

That is true, but it is also true that the ACPI spec doesn't say
how how many times STA will be evaluated, if at all.

  
traces -----------------------------------------------


Device PC11
000060e4:  02 . .  Name _HID
000060e9:  03 . . .  PNP0A03  PCI Bus  0x030ad041
000060ee:  02 . .  Name _UID
000060f3:  03 . . .  0x0b
000060f5:  02 . .  Name _ADR
000060fa:  03 . . .  0x00
000060fc:  02 ---- 'PCI bus number setup by the BIOS'  Method _BBN
00006102:  03 . . .  0x00
00006103:  03 . . .  Return
00006104:  04 . . . .  path: \_SB_.CSFF.IO15.B1__
00006117:  02 ---- 'Dynamic_Statu'  Method _STA
0000611d:  03 . . .  0x00
0000611e:  03 . . .  If
00006120:  04 . . . .  LEqual
00006121:  05 . . . . .  path: \_SB_.CSFF.IO11.HUBD
00006134:  05 . . . . .  0x00
00006136:  04 . . . .  Return
00006137:  05 . . . . .  0x0f
00006139:  03 . . .  Return
0000613a:  04 . . . .  0x00
0000613c:  02 ---- 'Current Resource Setting'  Method _CRS
00006142:  03 . . .  0x00
00006143:  03 . . .  Return
00006144:  04 . . . .  path: \_SB_.HLRS
0000614e:  03 . . .  0x01
00006150:  03 . . .  0x01
00006152:  02

    

Does this trace show the access to the bus that does not exist?
Where is the loop?
  
Yes (see traces).


thanks,
-Len

  
Moore, Robert wrote: 
We changed the device initialization sequence to improve boot
performance by not executing _STA unless an _INI is actually present.

The change to selectively run _STA was made in 20051216, from the
release notes:

"Implemented an optimization to the initialization sequence that can
improve boot time. During ACPI device initialization, the _STA method is
now run if and only if the _INI method exists. The _STA method is used
to determine if the device is present; An _INI can only be run if _STA
returns present, but it is a waste of time to run the _STA method if the
_INI does not exist."

  
Our BIOS provides description for the maximum configuration, then I think it relies on the fact we run _STA method on the bus before accessing devices on that bus...


It is my understanding of the ACPI spec that there is no requirement
that _STA be run, ever. There is only a requirement that _INI be run if
the device is present and _INI exists.
 
Therefore, the optimization above was implemented because we were only
running _STA to determine whether or not to run _INI. If there is no
_INI present, it is pointless to run the _STA.


  
Having a look to ACPI specification, I could find nowhere the 
restriction that _STA method is called only when an _INI method is 
provided for the device:

      

Yes, there is no restriction on when or if _STA can be run. However, I
do not think that there a *requirement* to run _STA, only _INI.

I don't understand why running _STA fixes the problem. Exactly what or
who is depending on _STA to be run?

Bob
  
-
: send the line "unsubscribe linux-ia64" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [Sparc Linux]     [DCCP]     [Linux ARM]     [Yosemite News]     [Linux SCSI]     [Linux x86_64]     [Linux for Ham Radio]

  Powered by Linux