On Tue, 18 Jun 2013 20:33:17 +0200 Christian Helmuth (CH) wrote:
CH> On Tue, Jun 18, 2013 at 05:14:31PM +0000, Jilong Kuang - SISA wrote: CH> > I guess the reason why current code doesn't cover all devices is CH> > that it assumes all devices can be scanned through recursive CH> > function call starting from bus 0 (a single tree structure). CH> > However, when there are multiple root complexes, there are more than CH> > one tree. So one has to explicitly jump to the next root node and CH> > search its tree. CH> CH> Is there any documentation or best practice how to discover "root CH> nodes"? Do we need ACPI or other platform information for that? CH> Scanning through all possible PCI nodes sounds not desirable as it CH> takes its time.
Jilong sent the DSDT of his machine, which lists the different PCI root complexes as follows:
Device (PCI0) { Method (^BN00, 0, NotSerialized) { Return (Zero) }
Method (_BBN, 0, NotSerialized) // _BBN: BIOS Bus Number { Return (BN00 ()) } }
Device (PCI1) { Method (^BN40, 0, NotSerialized) { Return (0x40) }
Method (_BBN, 0, NotSerialized) // _BBN: BIOS Bus Number { Return (BN40 ()) } }
Device (PCI2) { Method (^BN80, 0, NotSerialized) { Return (0x80) }
Method (_BBN, 0, NotSerialized) // _BBN: BIOS Bus Number { Return (BN80 ()) } }
Device (PCI3) { Method (^BNC0, 0, NotSerialized) { Return (0xC0) }
Method (_BBN, 0, NotSerialized) // _BBN: BIOS Bus Number { Return (BNC0 ()) } }
There are 4 root complexes, starting at bus numbers 0, 0x40, 0x80, 0xc0 respectively and Genode would have to scan each of them. You can use the _BBN methods in the DSDT to enumerate them.
Cheers, Udo