blob: feaf56b53384d175df67ea73ff4ca9c17b60ac91 [file] [log] [blame]
/** @file
SSDT Pci Osc (Operating System Capabilities)
Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Reference(s):
- PCI Firmware Specification - Revision 3.3
- ACPI 6.4 specification:
- s6.2.13 "_PRT (PCI Routing Table)"
- s6.1.1 "_ADR (Address)"
- linux kernel code
**/
DefinitionBlock ("SsdtPciOsc.aml", "SSDT", 2, "ARMLTD", "PCI-OSC", 1) {
// This table is just a template and is never installed as a table.
// Pci devices are dynamically created at runtime as:
// ASL:
// Device (PCIx) {
// ...
// }
// and the _OSC method available below is appended to the PCIx device as:
// ASL:
// Device (PCIx) {
// ...
// Method (_OSC, 4 {
// ...
// })
// }
Method (_OSC, 4) {
//
// OS Control Handoff
//
Name (SUPP, Zero) // PCI _OSC Support Field value
Name (CTRL, Zero) // PCI _OSC Control Field value
// Create DWord-addressable fields from the Capabilities Buffer
CreateDWordField (Arg3, 0, CDW1)
CreateDWordField (Arg3, 4, CDW2)
CreateDWordField (Arg3, 8, CDW3)
// Check for proper UUID
If (LEqual (Arg0,ToUUID ("33DB4D5B-1FF7-401C-9657-7441C03DD766"))) {
// Save Capabilities DWord2 & 3
Store (CDW2, SUPP)
Store (CDW3, CTRL)
// Only allow native hot plug control if OS supports:
// * ASPM
// * Clock PM
// * MSI/MSI-X
If (LNotEqual (And (SUPP, 0x16), 0x16)) {
And (CTRL, 0x1E, CTRL) // Mask bit 0 (and undefined bits)
}
// Always allow native PME, AER (no dependencies)
// Never allow SHPC (no SHPC controller in this system)
And (CTRL, 0x1D, CTRL)
If (LNotEqual (Arg1, One)) { // Unknown revision
Or (CDW1, 0x08, CDW1)
}
If (LNotEqual (CDW3, CTRL)) { // Capabilities bits were masked
Or (CDW1, 0x10, CDW1)
}
// Update DWORD3 in the buffer
Store (CTRL,CDW3)
Return (Arg3)
} Else {
Or (CDW1, 4, CDW1) // Unrecognized UUID
Return (Arg3)
} // If
} // _OSC
}