From a42bdfccc34fa671891758fed27b4618ba5e5142 Mon Sep 17 00:00:00 2001 From: jljusten Date: Mon, 13 Aug 2012 15:40:31 +0000 Subject: [PATCH] OvmfPkg: _DIS and _SRS methods should have permanent effect Kill PDIS and PSRS as they are writing to copies of PIR[A-D], not PIR[A-D] themselves. Use specialized _DIS and _SRS methods that access PIR[A-D] directly. (This should be solvable by passing RefOf (PIRA) etc to PDIS/PSRS, however the RHEL-6.3 kernel AML parser seems to choke on it. The rules described in ACPIspec5.0 Table 19-316 "Object Storing and Copying Rules" don't seem to work: ACPI Error: Needed [Integer/String/Buffer], found [Reference] ffff88003ee02420 (20090903/exresop-422) ACPI Exception: AE_AML_OPERAND_TYPE, While resolving operands for [OpcodeName unavailable] (20090903/dswexec-445) ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPC_.PDIS] (Node ffff88003f638b50), AE_AML_OPERAND_TYPE ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPC_.LNKA._DIS] (Node ffff88003f638a10), AE_AML_OPERAND_TYPE When changing the method too, so that it writes to DerefOf (Arg0) instead of Arg0, ie. explicitly dereferencing rather than expecting the auto-deref to work: ACPI Error: Needed type [Reference], found [RegionField] ffff88003f639858 (20090903/exresop-104) ACPI Exception: AE_AML_OPERAND_TYPE, While resolving operands for [OpcodeName unavailable] (20090903/dswexec-445) ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPC_.PDIS] (Node ffff88003f638b50), AE_AML_OPERAND_TYPE ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPC_.LNKA._DIS] (Node ffff88003f638a10), AE_AML_OPERAND_TYPE In short, when passing a RefOf, it is recognized as a reference inside the method but mistakenly refused. When trying to deref it explicitly with DerefOf, then it's suddenly not recognized as a reference.) Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Reviewed-by: Jordan Justen git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13621 6f19259b-4bc3-4df7-8a09-765794883524 --- OvmfPkg/AcpiTables/Dsdt.asl | 51 ++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/OvmfPkg/AcpiTables/Dsdt.asl b/OvmfPkg/AcpiTables/Dsdt.asl index 4c791c1431..e12c3e9a07 100644 --- a/OvmfPkg/AcpiTables/Dsdt.asl +++ b/OvmfPkg/AcpiTables/Dsdt.asl @@ -239,13 +239,6 @@ DefinitionBlock ("Dsdt.aml", "DSDT", 1, "INTEL ", "OVMF ", 3) { } } - // - // _DIS method for LNKA, LNKB, LNKC, LNKD - // - Method (PDIS, 1, NotSerialized) { - Or (Arg0, 0x80, Arg0) - } - // // _CRS method for LNKA, LNKB, LNKC, LNKD // @@ -284,14 +277,6 @@ DefinitionBlock ("Dsdt.aml", "DSDT", 1, "INTEL ", "OVMF ", 3) { } }) - // - // _SRS method for LNKA, LNKB, LNKC, LNKD - // - Method (PSRS, 2, NotSerialized) { - CreateDWordField (Arg1, 0x05, IRQW) - Store (IRQW, Arg0) - } - // // PCI IRQ Link A // @@ -300,10 +285,15 @@ DefinitionBlock ("Dsdt.aml", "DSDT", 1, "INTEL ", "OVMF ", 3) { Name (_UID, 1) Method (_STA, 0, NotSerialized) { Return (PSTA (PIRA)) } - Method (_DIS, 0, NotSerialized) { PDIS (PIRA) } + Method (_DIS, 0, NotSerialized) { + Or (PIRA, 0x80, PIRA) // set disable-bit + } Method (_CRS, 0, NotSerialized) { Return (PCRS (PIRA)) } Method (_PRS, 0, NotSerialized) { Return (PPRS) } - Method (_SRS, 1, NotSerialized) { PSRS (PIRA, Arg0) } + Method (_SRS, 1, NotSerialized) { + CreateDWordField (Arg0, 0x05, IRQW) + Store (IRQW, PIRA) + } } // @@ -314,10 +304,15 @@ DefinitionBlock ("Dsdt.aml", "DSDT", 1, "INTEL ", "OVMF ", 3) { Name (_UID, 2) Method (_STA, 0, NotSerialized) { Return (PSTA (PIRB)) } - Method (_DIS, 0, NotSerialized) { PDIS (PIRB) } + Method (_DIS, 0, NotSerialized) { + Or (PIRB, 0x80, PIRB) // set disable-bit + } Method (_CRS, 0, NotSerialized) { Return (PCRS (PIRB)) } Method (_PRS, 0, NotSerialized) { Return (PPRS) } - Method (_SRS, 1, NotSerialized) { PSRS (PIRB, Arg0) } + Method (_SRS, 1, NotSerialized) { + CreateDWordField (Arg0, 0x05, IRQW) + Store (IRQW, PIRB) + } } // @@ -328,10 +323,15 @@ DefinitionBlock ("Dsdt.aml", "DSDT", 1, "INTEL ", "OVMF ", 3) { Name (_UID, 3) Method (_STA, 0, NotSerialized) { Return (PSTA (PIRC)) } - Method (_DIS, 0, NotSerialized) { PDIS (PIRC) } + Method (_DIS, 0, NotSerialized) { + Or (PIRC, 0x80, PIRC) // set disable-bit + } Method (_CRS, 0, NotSerialized) { Return (PCRS (PIRC)) } Method (_PRS, 0, NotSerialized) { Return (PPRS) } - Method (_SRS, 1, NotSerialized) { PSRS (PIRC, Arg0) } + Method (_SRS, 1, NotSerialized) { + CreateDWordField (Arg0, 0x05, IRQW) + Store (IRQW, PIRC) + } } // @@ -342,10 +342,15 @@ DefinitionBlock ("Dsdt.aml", "DSDT", 1, "INTEL ", "OVMF ", 3) { Name (_UID, 1) Method (_STA, 0, NotSerialized) { Return (PSTA (PIRD)) } - Method (_DIS, 0, NotSerialized) { PDIS (PIRD) } + Method (_DIS, 0, NotSerialized) { + Or (PIRD, 0x80, PIRD) // set disable-bit + } Method (_CRS, 0, NotSerialized) { Return (PCRS (PIRD)) } Method (_PRS, 0, NotSerialized) { Return (PPRS) } - Method (_SRS, 1, NotSerialized) { PSRS (PIRD, Arg0) } + Method (_SRS, 1, NotSerialized) { + CreateDWordField (Arg0, 0x05, IRQW) + Store (IRQW, PIRD) + } } // -- 2.39.5