Some platfoms may want to modify the ACPI table created. Add support for protocol that can provide an alternative implementation.
Signed-off-by: Jeff Brasen <jbra...@nvidia.com> --- DynamicTablesPkg/DynamicTablesPkg.dec | 3 + .../Protocol/SsdtPcieOverrideProtocol.h | 63 +++++++++++++++++++ .../AcpiSsdtPcieLibArm/SsdtPcieGenerator.c | 31 ++++++++- .../Arm/AcpiSsdtPcieLibArm/SsdtPcieLibArm.inf | 4 ++ 4 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 DynamicTablesPkg/Include/Protocol/SsdtPcieOverrideProtocol.h diff --git a/DynamicTablesPkg/DynamicTablesPkg.dec b/DynamicTablesPkg/DynamicTablesPkg.dec index a890a048be..bb66bdaf14 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dec +++ b/DynamicTablesPkg/DynamicTablesPkg.dec @@ -43,6 +43,9 @@ # Dynamic Table Factory Protocol GUID gEdkiiDynamicTableFactoryProtocolGuid = { 0x91d1e327, 0xfe5a, 0x49b8, { 0xab, 0x65, 0xe, 0xce, 0x2d, 0xdb, 0x45, 0xec } } + # Protocol to override PCI SSDT table generation + gEdkiiDynamicTableSsdtPcieOverrideProtocolGuid = { 0x962e8b44, 0x23b3, 0x41da, { 0x9f, 0x36, 0xca, 0xde, 0x68, 0x49, 0xfb, 0xf6 } } + [PcdsFixedAtBuild] # Maximum number of Custom ACPI Generators diff --git a/DynamicTablesPkg/Include/Protocol/SsdtPcieOverrideProtocol.h b/DynamicTablesPkg/Include/Protocol/SsdtPcieOverrideProtocol.h new file mode 100644 index 0000000000..29568a0159 --- /dev/null +++ b/DynamicTablesPkg/Include/Protocol/SsdtPcieOverrideProtocol.h @@ -0,0 +1,63 @@ +/** @file + + Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef SSDT_PCIE_OVERRIDE_PROTOCOL_H_ +#define SSDT_PCIE_OVERRIDE_PROTOCOL_H_ + +#include <ArmNameSpaceObjects.h> +#include <Library/AmlLib/AmlLib.h> + +/** This macro defines the SSDT PCI Override Protocol GUID. + + GUID: {D85A4835-5A82-4894-AC02-706F43D5978E} +*/ +#define EDKII_SSDT_PCI_OVERRIDE_PROTOCOL_GUID \ + { 0x962e8b44, 0x23b3, 0x41da, \ + { 0x9f, 0x36, 0xca, 0xde, 0x68, 0x49, 0xfb, 0xf6 } \ + }; + +/** + Forward declarations: +*/ +typedef struct SsdtOverridePciProtocol EDKII_SSDT_PCI_OVERRIDE_PROTOCOL; + +/** The UpdateTable function allows the override protocol to update the + * PCIe SSDT table prior to being created. + + @param [in] This Pointer to the SSDT PCI Override Protocol. + @param [in] PciInfo The PCIe configuration info for this node. + @param [in] Uid UID that was selected for this PCIe node. + @param [in, out] PciNode Pointer to the PCI node of this ACPI table. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_DEVICE_ERROR Failed to update the table. +**/ +typedef +EFI_STATUS +(EFIAPI *EDKII_SSDT_PCI_OVERRIDE_PROTOCOL_UPDATE_TABLE)( + IN CONST EDKII_SSDT_PCI_OVERRIDE_PROTOCOL *CONST This, + IN CONST CM_ARM_PCI_CONFIG_SPACE_INFO *PciInfo, + IN UINT32 Uid, + IN OUT AML_ROOT_NODE_HANDLE *PciNode + ); + +/** The EDKII_CONFIGURATION_MANAGER_PROTOCOL structure describes the + Configuration Manager Protocol interface. +*/ +typedef struct SsdtOverridePciProtocol { + /** The interface used to update the ACPI table for PCI. + */ + EDKII_SSDT_PCI_OVERRIDE_PROTOCOL_UPDATE_TABLE UpdateTable; +} EDKII_SSDT_PCI_OVERRIDE_PROTOCOL; + +/** The SSDT PCI Override Protocol GUID. +*/ +extern EFI_GUID gEdkiiDynamicTableSsdtPcieOverrideProtocolGuid; + +#endif // SSDT_PCIE_OVERRIDE_PROTOCOL_H_ diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieGenerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieGenerator.c index 9f785ca5ac..46e0a98b98 100644 --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieGenerator.c @@ -20,6 +20,7 @@ #include <Library/BaseMemoryLib.h> #include <Library/DebugLib.h> #include <Library/MemoryAllocationLib.h> +#include <Library/UefiBootServicesTableLib.h> #include <Protocol/AcpiTable.h> // Module specific include files. @@ -30,6 +31,7 @@ #include <Library/TableHelperLib.h> #include <Library/AmlLib/AmlLib.h> #include <Protocol/ConfigurationManagerProtocol.h> +#include <Protocol/SsdtPcieOverrideProtocol.h> #include "SsdtPcieGenerator.h" @@ -804,9 +806,10 @@ GeneratePciDevice ( { EFI_STATUS Status; - CHAR8 AslName[AML_NAME_SEG_SIZE + 1]; - AML_OBJECT_NODE_HANDLE ScopeNode; - AML_OBJECT_NODE_HANDLE PciNode; + CHAR8 AslName[AML_NAME_SEG_SIZE + 1]; + AML_OBJECT_NODE_HANDLE ScopeNode; + AML_OBJECT_NODE_HANDLE PciNode; + EDKII_SSDT_PCI_OVERRIDE_PROTOCOL *OverrideProtocol; ASSERT (Generator != NULL); ASSERT (CfgMgrProtocol != NULL); @@ -866,6 +869,28 @@ GeneratePciDevice ( // Add the template _OSC method. Status = AddOscMethod (PciNode); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + Status = gBS->LocateProtocol ( + &gEdkiiDynamicTableSsdtPcieOverrideProtocolGuid, + NULL, + (VOID **)&OverrideProtocol + ); + if (!EFI_ERROR (Status)) { + Status = OverrideProtocol->UpdateTable ( + OverrideProtocol, + PciInfo, + Uid, + PciNode + ); + } else { + // Not an error if override protocol is not found + Status = EFI_SUCCESS; + } + ASSERT_EFI_ERROR (Status); return Status; } diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieLibArm.inf b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieLibArm.inf index 431e32a777..8e916f15e9 100644 --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieLibArm.inf +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieLibArm.inf @@ -30,6 +30,10 @@ AcpiHelperLib AmlLib BaseLib + UefiBootServicesTableLib [Pcd] gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdPciUseSegmentAsUid + +[Protocols] + gEdkiiDynamicTableSsdtPcieOverrideProtocolGuid -- 2.25.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#91001): https://edk2.groups.io/g/devel/message/91001 Mute This Topic: https://groups.io/mt/92113683/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-