diff options
author | jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524> | 2012-08-13 15:40:31 +0000 |
---|---|---|
committer | jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524> | 2012-08-13 15:40:31 +0000 |
commit | a42bdfccc34fa671891758fed27b4618ba5e5142 (patch) | |
tree | 0848a94a960d51cf41f473f456f21d57a5cf858b /OvmfPkg/AcpiTables | |
parent | 56daf8b90e208e6a32499775a104225f9989681c (diff) | |
download | edk2-platforms-a42bdfccc34fa671891758fed27b4618ba5e5142.tar.xz |
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 <lersek@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13621 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'OvmfPkg/AcpiTables')
-rw-r--r-- | OvmfPkg/AcpiTables/Dsdt.asl | 51 |
1 files 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 @@ -240,13 +240,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
//
Method (PCRS, 1, NotSerialized) {
@@ -285,14 +278,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
//
Device (LNKA) {
@@ -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)
+ }
}
//
|