Hi,
Latest seabios master has trouble with interrupts. Running qemu 1.0, Fedora 16 (linux kernel 3.1) as guest. Linux ends up disabling both IRQ 10 and 11. Device drivers seem to miss interrupts:
ehci_hcd 0000:00:1d.7: Unlink after no-IRQ? Controller is probably using the wrong IRQ.
Bisecting points to this commit:
commit a65f417c8430ce6781cbbfe84381a97d60628d81 Author: Kevin O'Connor kevin@koconnor.net Date: Sun Sep 25 23:08:58 2011 -0400
Consolidate DSDT copy-and-paste PCI IRQ code into method calls.
Use method calls in LNK[ABCDS] object methods - this reduces the cut-and-paste code. It also makes it simpler and the object size smaller.
Signed-off-by: Kevin O'Connor kevin@koconnor.net
Ideas anyone?
thanks, Gerd
On Tue, Dec 13, 2011 at 01:44:04PM +0100, Gerd Hoffmann wrote:
Hi,
Latest seabios master has trouble with interrupts. Running qemu 1.0, Fedora 16 (linux kernel 3.1) as guest. Linux ends up disabling both IRQ 10 and 11. Device drivers seem to miss interrupts:
ehci_hcd 0000:00:1d.7: Unlink after no-IRQ? Controller is probably using the wrong IRQ.
Bisecting points to this commit:
commit a65f417c8430ce6781cbbfe84381a97d60628d81
Looks like RefOf() does something weird on Linux. I hate AML.
The patch below fixes the irq issue for me - can you check as well?
-Kevin
diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl index aff3f48..7082b65 100644 --- a/src/acpi-dsdt.dsl +++ b/src/acpi-dsdt.dsl @@ -508,10 +508,6 @@ DefinitionBlock ( } Return (0x0B) } - Method (IQDI, 1, NotSerialized) { - // _DIS method - disable interrupt - Or(DerefOf(Arg0), 0x80, Arg0) - } Method (IQCR, 1, NotSerialized) { // _CRS method - get current settings Name (PRR0, ResourceTemplate () @@ -525,11 +521,13 @@ DefinitionBlock ( } Return (PRR0) } - Method (IQSR, 2, NotSerialized) { - // _SRS method - set interrupt - CreateDWordField (Arg1, 0x05, PRRI) - Store (PRRI, Arg0) - } + // _DIS method - disable interrupt +#define DISIRQ(PRQVAR) \ + Or(PRQVAR, 0x80, PRQVAR) \ + // _SRS method - set interrupt +#define SETIRQ(PRQVAR, IRQINFO) \ + CreateDWordField (IRQINFO, 0x05, PRRI) \ + Store (PRRI, PRQVAR)
Device(LNKA) { Name(_HID, EISAID("PNP0C0F")) // PCI interrupt link @@ -539,9 +537,9 @@ DefinitionBlock ( { 5, 10, 11 } }) Method (_STA, 0, NotSerialized) { Return (IQST(PRQ0)) } - Method (_DIS, 0, NotSerialized) { IQDI(RefOf(PRQ0)) } + Method (_DIS, 0, NotSerialized) { DISIRQ(PRQ0) } Method (_CRS, 0, NotSerialized) { Return (IQCR(PRQ0)) } - Method (_SRS, 1, NotSerialized) { IQSR(RefOf(PRQ0), Arg0) } + Method (_SRS, 1, NotSerialized) { SETIRQ(PRQ0, Arg0) } } Device(LNKB) { Name(_HID, EISAID("PNP0C0F")) // PCI interrupt link @@ -551,9 +549,9 @@ DefinitionBlock ( { 5, 10, 11 } }) Method (_STA, 0, NotSerialized) { Return (IQST(PRQ1)) } - Method (_DIS, 0, NotSerialized) { IQDI(RefOf(PRQ1)) } + Method (_DIS, 0, NotSerialized) { DISIRQ(PRQ1) } Method (_CRS, 0, NotSerialized) { Return (IQCR(PRQ1)) } - Method (_SRS, 1, NotSerialized) { IQSR(RefOf(PRQ1), Arg0) } + Method (_SRS, 1, NotSerialized) { SETIRQ(PRQ1, Arg0) } } Device(LNKC) { Name(_HID, EISAID("PNP0C0F")) // PCI interrupt link @@ -563,9 +561,9 @@ DefinitionBlock ( { 5, 10, 11 } }) Method (_STA, 0, NotSerialized) { Return (IQST(PRQ2)) } - Method (_DIS, 0, NotSerialized) { IQDI(RefOf(PRQ2)) } + Method (_DIS, 0, NotSerialized) { DISIRQ(PRQ2) } Method (_CRS, 0, NotSerialized) { Return (IQCR(PRQ2)) } - Method (_SRS, 1, NotSerialized) { IQSR(RefOf(PRQ2), Arg0) } + Method (_SRS, 1, NotSerialized) { SETIRQ(PRQ2, Arg0) } } Device(LNKD) { Name(_HID, EISAID("PNP0C0F")) // PCI interrupt link @@ -575,9 +573,9 @@ DefinitionBlock ( { 5, 10, 11 } }) Method (_STA, 0, NotSerialized) { Return (IQST(PRQ3)) } - Method (_DIS, 0, NotSerialized) { IQDI(RefOf(PRQ3)) } + Method (_DIS, 0, NotSerialized) { DISIRQ(PRQ3) } Method (_CRS, 0, NotSerialized) { Return (IQCR(PRQ3)) } - Method (_SRS, 1, NotSerialized) { IQSR(RefOf(PRQ3), Arg0) } + Method (_SRS, 1, NotSerialized) { SETIRQ(PRQ3, Arg0) } } Device(LNKS) { Name(_HID, EISAID("PNP0C0F")) // PCI interrupt link @@ -587,7 +585,7 @@ DefinitionBlock ( { 9 } }) Method (_STA, 0, NotSerialized) { Return (IQST(PRQ0)) } - Method (_DIS, 0, NotSerialized) { IQDI(RefOf(PRQ0)) } + Method (_DIS, 0, NotSerialized) { DISIRQ(PRQ0) } Method (_CRS, 0, NotSerialized) { Return (IQCR(PRQ0)) } } }
On Fri, Dec 16, 2011 at 12:41:27PM +0100, Gerd Hoffmann wrote:
Hi,
Bisecting points to this commit:
commit a65f417c8430ce6781cbbfe84381a97d60628d81
Looks like RefOf() does something weird on Linux. I hate AML.
The patch below fixes the irq issue for me - can you check as well?
Fixes it for me too.
Thanks - I pushed this change.
-Kevin