| /** @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 | |
| } |