On May 2, 2008, at 7:35 PM, Marcelo Tosatti wrote: > Add 3 PCI bridges to the ACPI table: > - Move IRQ routing, slot device and GPE processing to separate files > which can be included from acpi-dsdt.dsl. > - Add _SUN methods to every slot device so as to avoid collisions > in OS handling. > - Fix copy&paste typo in slot devices 8/9 and 24/25. > > This table breaks PCI hotplug for older userspace, hopefully not an > issue (trivial enough to upgrade the BIOS). > > Signed-off-by: Marcelo Tosatti <[EMAIL PROTECTED]> > > Index: kvm-userspace.pci3/bios/acpi-dsdt.dsl > =================================================================== > --- kvm-userspace.pci3.orig/bios/acpi-dsdt.dsl > +++ kvm-userspace.pci3/bios/acpi-dsdt.dsl > @@ -208,218 +208,29 @@ DefinitionBlock ( > Name (_HID, EisaId ("PNP0A03")) > Name (_ADR, 0x00) > Name (_UID, 1) > - Name(_PRT, Package() { > - /* PCI IRQ routing table, example from ACPI 2.0a > specification, > - section 6.2.8.1 */ > - /* Note: we provide the same info as the PCI routing > - table of the Bochs BIOS */ > - > - // PCI Slot 0 > - Package() {0x0000ffff, 0, LNKD, 0}, > - Package() {0x0000ffff, 1, LNKA, 0}, > - Package() {0x0000ffff, 2, LNKB, 0}, > - Package() {0x0000ffff, 3, LNKC, 0},
[ ... snip ... ] > - // PCI Slot 31 > - Package() {0x001fffff, 0, LNKC, 0}, > - Package() {0x001fffff, 1, LNKD, 0}, > - Package() {0x001fffff, 2, LNKA, 0}, > - Package() {0x001fffff, 3, LNKB, 0}, > - }) > + > + Include ("acpi-irq-routing.dsl") > > OperationRegion(PCST, SystemIO, 0xae00, 0x08) > Field (PCST, DWordAcc, NoLock, WriteAsZeros) > - { > + { > PCIU, 32, > PCID, 32, > - } > - > + } Are these whitespace patches supposed to be here? > > OperationRegion(SEJ, SystemIO, 0xae08, 0x04) > Field (SEJ, DWordAcc, NoLock, WriteAsZeros) > { > B0EJ, 32, > } > > + Device (S0) { // Slot 0 > + Name (_ADR, 0x00000000) > + Method (_EJ0,1) { > + Store(0x1, B0EJ) > + Return (0x0) > + } > + } > + I'm having trouble understanding the semantic of the Sx devices here. What is this S0, S1 and S2 device? Maybe different names would make everything more understandable. > > Device (S1) { // Slot 1 > Name (_ADR, 0x00010000) > Method (_EJ0,1) { > @@ -436,28 +247,70 @@ DefinitionBlock ( > } > } > > - Device (S3) { // Slot 3 > + Device (S3) { // Slot 3, PCI-to-PCI bridge This device could be called BRI1 for example. That would make reading the DSDT a lot easier. > > Name (_ADR, 0x00030000) > - Method (_EJ0,1) { > - Store (0x8, B0EJ) > - Return (0x0) > + Include ("acpi-irq-routing.dsl") > + > + OperationRegion(PCST, SystemIO, 0xae0c, 0x08) > + Field (PCST, DWordAcc, NoLock, WriteAsZeros) > + { > + PCIU, 32, > + PCID, 32, > } > + > + OperationRegion(SEJ, SystemIO, 0xae14, 0x04) > + Field (SEJ, DWordAcc, NoLock, WriteAsZeros) > + { > + B1EJ, 32, > + } > + > + Name (SUN1, 30) > + Alias (\_SB.PCI0.S3.B1EJ, BEJ) > + Include ("acpi-pci-slots.dsl") [ ... snip ... ] > > Method(_L05) { > Return(0x01) > Index: kvm-userspace.pci3/bios/acpi-hotplug-gpe.dsl > =================================================================== > --- /dev/null > +++ kvm-userspace.pci3/bios/acpi-hotplug-gpe.dsl > @@ -0,0 +1,257 @@ > + /* Up status */ > + If (And(UP, 0x1)) { > + Notify(S0, 0x1) > + } While this is proper syntax I prefer the way Fabrice wrote the tables. Most of his entries were one-lined, even though they wouldn't end up like that when getting decompiled. In this case I'd vote for something like: If (And(UP, 0x1)) { Notify(S0, 0x1) } Which makes things easier to read again. The same goes for a lot of code below that chunk. > > + > + If (And(UP, 0x2)) { > + Notify(S1, 0x1) > + } > + [ ... snip ... ] > Index: kvm-userspace.pci3/bios/acpi-pci-slots.dsl > =================================================================== > --- /dev/null > +++ kvm-userspace.pci3/bios/acpi-pci-slots.dsl > @@ -0,0 +1,385 @@ > + Device (S0) { // Slot 0 > + Name (_ADR, 0x00000000) > + Method (_EJ0,1) { Hmm ... I never assumed anything could be wrong here, but doesn't that 1 mean there is one argument to the method? From the ACPI Specification: Method(_EJ0, 1){ //Hot docking support //Arg0: 0=insert, 1=eject So we aren't using this information? What else do we use? Sorry if I missed something. > > + Store(0x1, BEJ) > + Return (0x0) > + } > + Method(_SUN) { > + Add (SUN1, 0, Local0) > + Return (Local0) > + } > + } Same comment here. I don't like copy&paste code that goes over a lot of lines. Can't you simply do some helper methods that do what _EJ0 and _SUN do in a generic manner and Return that? I'd imagine something like: Device (S0) { // Slot 0 Name (_ADR, 0x00000000) Method (_EJ0,1) { Return( GEJ0(0x1) } Method(_SUN) { Return( GSUN(0) } } This looks way easier to read to me and keeps generic things generic and not copy&pasted. Nevertheless this is a nice approach, which will definitely show that we need to think about interrupt routing properly ;-). Alex ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel