From: "Marcin Juszkiewicz" <marcin.juszkiewicz@linaro.org>
To: devel@edk2.groups.io
Cc: Leif Lindholm <quic_llindhol@quicinc.com>,
Ard Biesheuvel <ardb+tianocore@kernel.org>,
Graeme Gregory <graeme@xora.org.uk>, Ray Ni <ray.ni@intel.com>,
Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
Subject: [edk2-devel] [PATCH edk2-platforms WIP 2/3] SbsaQemu: describe PCIe buses in SSDT tables
Date: Thu, 25 Apr 2024 14:02:45 +0200 [thread overview]
Message-ID: <20240425-review-multiple-pcie-0425-v1-2-68fdfd781f9e@linaro.org> (raw)
In-Reply-To: <20240425-review-multiple-pcie-0425-v1-0-68fdfd781f9e@linaro.org>
We can have more than one PCI Express bus. So instead of having static
description in DSDT we create SSDT table for each existing PCIe bus.
Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
---
Platform/Qemu/SbsaQemu/SbsaQemu.dsc | 2 +
.../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf | 37 +-
.../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiPcie.h | 23 +
.../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c | 87 ++-
.../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiPcie.c | 576 ++++++++++++++++++++
Silicon/Qemu/SbsaQemu/AcpiTables/Dsdt.asl | 302 ----------
.../Drivers/SbsaQemuAcpiDxe/SsdtTemplate.asl | 82 +++
7 files changed, 790 insertions(+), 319 deletions(-)
diff --git a/Platform/Qemu/SbsaQemu/SbsaQemu.dsc b/Platform/Qemu/SbsaQemu/SbsaQemu.dsc
index e246db8b0a23..b012eaa34147 100644
--- a/Platform/Qemu/SbsaQemu/SbsaQemu.dsc
+++ b/Platform/Qemu/SbsaQemu/SbsaQemu.dsc
@@ -173,6 +173,8 @@ [LibraryClasses.common]
ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf
AcpiLib|EmbeddedPkg/Library/AcpiLib/AcpiLib.inf
+ AcpiHelperLib|DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf
+ AmlLib|DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf
ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf
ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf
diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
index 727c8e82d16e..6de1073e6ac2 100644
--- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
+++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
@@ -18,18 +18,25 @@ [Defines]
[Sources]
SbsaQemuAcpiDxe.c
+ SbsaQemuAcpiDxe.h
+ SbsaQemuAcpiPcie.c
+ SbsaQemuAcpiPcie.h
+ SsdtTemplate.asl
[Packages]
ArmPkg/ArmPkg.dec
ArmPlatformPkg/ArmPlatformPkg.dec
ArmVirtPkg/ArmVirtPkg.dec
+ DynamicTablesPkg/DynamicTablesPkg.dec
EmbeddedPkg/EmbeddedPkg.dec
MdeModulePkg/MdeModulePkg.dec
MdePkg/MdePkg.dec
Silicon/Qemu/SbsaQemu/SbsaQemu.dec
[LibraryClasses]
+ AcpiHelperLib
AcpiLib
+ AmlLib
ArmLib
BaseMemoryLib
BaseLib
@@ -37,6 +44,7 @@ [LibraryClasses]
DxeServicesLib
HardwareInfoLib
PcdLib
+ PciLib
PrintLib
UefiDriverEntryPoint
UefiLib
@@ -54,14 +62,39 @@ [Pcd]
gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdSmmuBase
[Depex]
- gEfiAcpiTableProtocolGuid ## CONSUMES
+ # We want all PCIe buses to be scanned first
+ gEfiPciIoProtocolGuid ## CONSUMES
[Guids]
gEdkiiPlatformHasAcpiGuid
[Protocols]
gEfiAcpiSdtProtocolGuid
- gEfiAcpiTableProtocolGuid ## CONSUMES
+ gEfiAcpiTableProtocolGuid
+ gEfiPciRootBridgeIoProtocolGuid
+
+
+[Pcd]
+ gArmTokenSpaceGuid.PcdPciBusMin
+ gArmTokenSpaceGuid.PcdPciBusMax
+ gArmTokenSpaceGuid.PcdPciIoBase
+ gArmTokenSpaceGuid.PcdPciIoSize
+ gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation
+ gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdPciIoLimit
+
+ gArmTokenSpaceGuid.PcdPciMmio32Base
+ gArmTokenSpaceGuid.PcdPciMmio32Size
+ gEfiMdePkgTokenSpaceGuid.PcdPciMmio32Translation
+ gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdPciMmio32Limit
+
+ gArmTokenSpaceGuid.PcdPciMmio64Base
+ gArmTokenSpaceGuid.PcdPciMmio64Size
+ gEfiMdePkgTokenSpaceGuid.PcdPciMmio64Translation
+ gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdPciMmio64Limit
+
+ gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
+ gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdPciExpressBarSize
+ gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdPciExpressBarLimit
[FixedPcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId
diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiPcie.h b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiPcie.h
new file mode 100644
index 000000000000..56cc6f1381da
--- /dev/null
+++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiPcie.h
@@ -0,0 +1,23 @@
+/** @file
+* This file is an ACPI driver for the Qemu SBSA platform.
+*
+* Copyright (c) 2024, Linaro Ltd. All rights reserved.
+*
+* SPDX-License-Identifier: BSD-2-Clause-Patent
+*
+**/
+
+#ifndef SBSAQEMU_ACPI_PCIE_H
+#define SBSAQEMU_ACPI_PCIE_H
+
+#pragma pack(1)
+
+/* AML bytecode generated from SsdtTemplate.asl */
+extern CHAR8 ssdttemplate_aml_code[];
+
+EFI_STATUS
+AddPcieHostBridges (
+ AML_OBJECT_NODE_HANDLE ScopeNode
+ );
+
+#endif
diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
index 30239e7dca0d..f3d5dc9e9ba7 100644
--- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
+++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
@@ -6,28 +6,27 @@
* SPDX-License-Identifier: BSD-2-Clause-Patent
*
**/
-#include <IndustryStandard/Acpi.h>
-#include <IndustryStandard/AcpiAml.h>
#include <IndustryStandard/IoRemappingTable.h>
#include <IndustryStandard/SbsaQemuAcpi.h>
#include <IndustryStandard/SbsaQemuPlatformVersion.h>
+
#include <Library/AcpiLib.h>
+#include <Library/AmlLib/AmlLib.h>
#include <Library/ArmLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/PcdLib.h>
-#include <Library/PrintLib.h>
#include <Library/HardwareInfoLib.h>
+#include <Library/PrintLib.h>
#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiLib.h>
+
#include <Protocol/AcpiTable.h>
+#include <Protocol/PciRootBridgeIo.h>
+
#include "SbsaQemuAcpiDxe.h"
+#include "SbsaQemuAcpiPcie.h"
#pragma pack(1)
-
static UINTN GicItsBase;
#pragma pack ()
@@ -36,7 +35,7 @@ static UINTN GicItsBase;
* A Function to Compute the ACPI Table Checksum
*/
VOID
-AcpiPlatformChecksum (
+AcpiTableChecksum (
IN UINT8 *Buffer,
IN UINTN Size
)
@@ -189,7 +188,7 @@ AddIortTable (
CopyMem (New, &Rc, sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE));
New += sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE);
- AcpiPlatformChecksum ((UINT8*) PageAddress, TableSize);
+ AcpiTableChecksum ((UINT8*) PageAddress, TableSize);
Status = AcpiTable->InstallAcpiTable (
AcpiTable,
@@ -314,7 +313,7 @@ AddMadtTable (
New += sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE);
}
- AcpiPlatformChecksum ((UINT8*) PageAddress, TableSize);
+ AcpiTableChecksum ((UINT8*) PageAddress, TableSize);
Status = AcpiTable->InstallAcpiTable (
AcpiTable,
@@ -467,7 +466,7 @@ AddSsdtTable (
}
// Perform Checksum
- AcpiPlatformChecksum ((UINT8*) PageAddress, TableSize);
+ AcpiTableChecksum ((UINT8*) PageAddress, TableSize);
Status = AcpiTable->InstallAcpiTable (
AcpiTable,
@@ -572,7 +571,7 @@ AddPpttTable (
}
// Perform Checksum
- AcpiPlatformChecksum ((UINT8*) PageAddress, TableSize);
+ AcpiTableChecksum ((UINT8*) PageAddress, TableSize);
Status = AcpiTable->InstallAcpiTable (
AcpiTable,
@@ -667,7 +666,7 @@ AddGtdtTable (
New += sizeof (EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE);
// Perform Checksum
- AcpiPlatformChecksum ((UINT8*) PageAddress, TableSize);
+ AcpiTableChecksum ((UINT8*) PageAddress, TableSize);
Status = AcpiTable->InstallAcpiTable (
AcpiTable,
@@ -752,7 +751,7 @@ AddSratTable (
}
// Perform Checksum
- AcpiPlatformChecksum ((UINT8*) PageAddress, TableSize);
+ AcpiTableChecksum ((UINT8*) PageAddress, TableSize);
Status = AcpiTable->InstallAcpiTable (
AcpiTable,
@@ -832,6 +831,58 @@ DisableXhciOnOlderPlatVer (
return Status;
}
+/** Adds the SSDT ACPI table with PCIe nodes.
+
+ @param AcpiTable The ACPI Table.
+
+ @return EFI_SUCCESS on success, or an error code.
+
+**/
+STATIC
+EFI_STATUS
+AddSsdtPcieTable (
+ IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable
+ )
+{
+ EFI_STATUS Status;
+ UINTN TableHandle;
+ EFI_ACPI_DESCRIPTION_HEADER *Table;
+ AML_ROOT_NODE_HANDLE RootNode;
+ AML_OBJECT_NODE_HANDLE ScopeNode;
+
+ Status = AmlCodeGenDefinitionBlock ("SSDT", "LINARO", "SBSAQEMU", 0x1, &RootNode);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT: AmlCodeGenDefinitionBlock failed."
+ " Status = %r\n",
+ Status
+ ));
+ }
+
+ AmlCodeGenScope ("_SB_", RootNode, &ScopeNode);
+
+ AddPcieHostBridges(ScopeNode);
+
+ // Serialize the tree.
+ Status = AmlSerializeDefinitionBlock (
+ RootNode,
+ &Table
+ );
+
+ Status = AcpiTable->InstallAcpiTable (
+ AcpiTable,
+ Table,
+ Table->Length,
+ &TableHandle
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to install SSDT table\n"));
+ }
+
+ return EFI_SUCCESS;
+}
+
EFI_STATUS
EFIAPI
@@ -895,5 +946,11 @@ InitializeSbsaQemuAcpiDxe (
DEBUG ((DEBUG_ERROR, "Failed to handle XHCI enablement\n"));
}
+ Status = AddSsdtPcieTable (AcpiTable);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to add SSDT table\n"));
+ }
+
+
return EFI_SUCCESS;
}
diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiPcie.c b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiPcie.c
new file mode 100644
index 000000000000..f5595b8a1baa
--- /dev/null
+++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiPcie.c
@@ -0,0 +1,576 @@
+/** @file
+* This file is an ACPI driver for the Qemu SBSA platform.
+*
+* Copyright (c) 2024, Linaro Ltd. All rights reserved.
+*
+* SPDX-License-Identifier: BSD-2-Clause-Patent
+*
+**/
+
+#include <Library/AcpiHelperLib.h>
+#include <Library/AmlLib/AmlLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/PciHostBridgeLib.h>
+#include <Library/PrintLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+
+#include <Protocol/PciRootBridgeIo.h>
+
+#include "SbsaQemuAcpiPcie.h"
+
+#pragma pack(1)
+
+/** Adds the _OSC method to the PCIe node.
+
+ @param PciNode PCIe device node.
+
+ @return EFI_SUCCESS on success, or an error code.
+
+**/
+STATIC
+EFI_STATUS
+AddOscMethod (
+ IN OUT AML_OBJECT_NODE_HANDLE PciNode
+ )
+{
+ EFI_STATUS Status;
+ EFI_ACPI_DESCRIPTION_HEADER *SsdtPcieOscTemplate;
+ AML_ROOT_NODE_HANDLE OscTemplateRoot;
+ AML_OBJECT_NODE_HANDLE OscNode;
+ AML_OBJECT_NODE_HANDLE ClonedOscNode;
+
+ ASSERT (PciNode != NULL);
+
+ /* Parse the Ssdt Pci Osc Template. */
+ SsdtPcieOscTemplate = (EFI_ACPI_DESCRIPTION_HEADER *)
+ ssdttemplate_aml_code;
+
+ Status = AmlParseDefinitionBlock (
+ SsdtPcieOscTemplate,
+ &OscTemplateRoot
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SSDT-PCI-OSC: Failed to parse SSDT PCI OSC Template."
+ " Status = %r\n",
+ Status
+ ));
+ return Status;
+ }
+
+ Status = AmlFindNode (OscTemplateRoot, "\\_OSC", &OscNode);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "AmlFindNode: %r\n", Status));
+ return Status;
+ }
+
+ Status = AmlCloneTree (OscNode, &ClonedOscNode);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "AmlCloneTree: %r\n", Status));
+ return Status;
+ }
+
+ Status = AmlAttachNode (PciNode, ClonedOscNode);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "AmlAttachNode: %r\n", Status));
+ // Free the cloned node.
+ AmlDeleteTree (ClonedOscNode);
+ return Status;
+ }
+
+ return Status;
+}
+
+/** Creates a PCI Interrupt Link Device.
+
+ @param PciDeviceHandle PCIe device node.
+ @param Uid UID of the Link Device.
+ @param LinkName Name of the Device.
+ @param Irq IRQ number.
+
+**/
+STATIC
+VOID
+GenPciLinkDevice (
+ AML_OBJECT_NODE_HANDLE PciDeviceHandle,
+ UINT32 Uid,
+ CONST CHAR8 *LinkName,
+ UINT32 Irq
+ )
+{
+ EFI_STATUS Status;
+ UINT32 EisaId;
+ AML_OBJECT_NODE_HANDLE GsiNode;
+
+ AmlCodeGenDevice (LinkName, PciDeviceHandle, &GsiNode);
+
+ Status = AmlGetEisaIdFromString ("PNP0C0F", &EisaId);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ return;
+ }
+
+ AmlCodeGenNameInteger ("_HID", EisaId, GsiNode, NULL);
+ AmlCodeGenNameInteger ("_UID", Uid, GsiNode, NULL);
+
+ AML_OBJECT_NODE_HANDLE Prs;
+
+ AmlCodeGenNameResourceTemplate ("_PRS", GsiNode, &Prs);
+ AmlCodeGenRdInterrupt (FALSE, FALSE, FALSE, FALSE, &Irq, 1, Prs, NULL);
+ AmlCodeGenMethodRetNameString ("_CRS", "_PRS", 0, TRUE, 0, GsiNode, NULL);
+ AmlCodeGenMethodRetNameString ("_SRS", NULL, 1, FALSE, 0, GsiNode, NULL);
+ AmlCodeGenMethodRetNameString ("_DIS", NULL, 0, FALSE, 0, GsiNode, NULL);
+}
+
+/** Creates a _PRT package.
+
+ @param PciDeviceHandle PCIe device node.
+
+**/
+STATIC
+VOID
+GenPrtEntries (
+ AML_OBJECT_NODE_HANDLE PciDeviceHandle
+ )
+{
+ AML_OBJECT_NODE_HANDLE PrtNode;
+
+ AmlCodeGenNamePackage ("_PRT", PciDeviceHandle, &PrtNode);
+
+ AmlAddPrtEntry (0x0000FFFF, 0, "GSI0", 0, PrtNode);
+ AmlAddPrtEntry (0x0000FFFF, 0, "GSI1", 0, PrtNode);
+ AmlAddPrtEntry (0x0000FFFF, 0, "GSI2", 0, PrtNode);
+ AmlAddPrtEntry (0x0000FFFF, 0, "GSI3", 0, PrtNode);
+
+ AmlAddPrtEntry (0x0001FFFF, 0, "GSI1", 0, PrtNode);
+ AmlAddPrtEntry (0x0001FFFF, 0, "GSI2", 1, PrtNode);
+ AmlAddPrtEntry (0x0001FFFF, 0, "GSI3", 2, PrtNode);
+ AmlAddPrtEntry (0x0001FFFF, 0, "GSI0", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0002FFFF, 0, "GSI2", 0, PrtNode);
+ AmlAddPrtEntry (0x0002FFFF, 0, "GSI3", 1, PrtNode);
+ AmlAddPrtEntry (0x0002FFFF, 0, "GSI0", 2, PrtNode);
+ AmlAddPrtEntry (0x0002FFFF, 0, "GSI1", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0003FFFF, 0, "GSI3", 0, PrtNode);
+ AmlAddPrtEntry (0x0003FFFF, 0, "GSI0", 1, PrtNode);
+ AmlAddPrtEntry (0x0003FFFF, 0, "GSI1", 2, PrtNode);
+ AmlAddPrtEntry (0x0003FFFF, 0, "GSI2", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0004FFFF, 0, "GSI0", 0, PrtNode);
+ AmlAddPrtEntry (0x0004FFFF, 0, "GSI1", 1, PrtNode);
+
+ AmlAddPrtEntry (0x0004FFFF, 0, "GSI2", 2, PrtNode);
+ AmlAddPrtEntry (0x0004FFFF, 0, "GSI3", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0005FFFF, 0, "GSI1", 0, PrtNode);
+ AmlAddPrtEntry (0x0005FFFF, 0, "GSI2", 1, PrtNode);
+ AmlAddPrtEntry (0x0005FFFF, 0, "GSI3", 2, PrtNode);
+ AmlAddPrtEntry (0x0005FFFF, 0, "GSI0", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0006FFFF, 0, "GSI2", 0, PrtNode);
+ AmlAddPrtEntry (0x0006FFFF, 0, "GSI3", 1, PrtNode);
+ AmlAddPrtEntry (0x0006FFFF, 0, "GSI0", 2, PrtNode);
+ AmlAddPrtEntry (0x0006FFFF, 0, "GSI1", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0007FFFF, 0, "GSI3", 0, PrtNode);
+ AmlAddPrtEntry (0x0007FFFF, 0, "GSI0", 1, PrtNode);
+ AmlAddPrtEntry (0x0007FFFF, 0, "GSI1", 2, PrtNode);
+ AmlAddPrtEntry (0x0007FFFF, 0, "GSI2", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0008FFFF, 0, "GSI0", 0, PrtNode);
+ AmlAddPrtEntry (0x0008FFFF, 0, "GSI1", 1, PrtNode);
+ AmlAddPrtEntry (0x0008FFFF, 0, "GSI2", 2, PrtNode);
+ AmlAddPrtEntry (0x0008FFFF, 0, "GSI3", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0009FFFF, 0, "GSI1", 0, PrtNode);
+ AmlAddPrtEntry (0x0009FFFF, 0, "GSI2", 1, PrtNode);
+ AmlAddPrtEntry (0x0009FFFF, 0, "GSI3", 2, PrtNode);
+ AmlAddPrtEntry (0x0009FFFF, 0, "GSI0", 3, PrtNode);
+
+ AmlAddPrtEntry (0x000AFFFF, 0, "GSI2", 0, PrtNode);
+ AmlAddPrtEntry (0x000AFFFF, 0, "GSI3", 1, PrtNode);
+ AmlAddPrtEntry (0x000AFFFF, 0, "GSI0", 2, PrtNode);
+ AmlAddPrtEntry (0x000AFFFF, 0, "GSI1", 3, PrtNode);
+
+ AmlAddPrtEntry (0x000BFFFF, 0, "GSI3", 0, PrtNode);
+ AmlAddPrtEntry (0x000BFFFF, 0, "GSI0", 1, PrtNode);
+ AmlAddPrtEntry (0x000BFFFF, 0, "GSI1", 2, PrtNode);
+ AmlAddPrtEntry (0x000BFFFF, 0, "GSI2", 3, PrtNode);
+
+ AmlAddPrtEntry (0x000CFFFF, 0, "GSI0", 0, PrtNode);
+ AmlAddPrtEntry (0x000CFFFF, 0, "GSI1", 1, PrtNode);
+ AmlAddPrtEntry (0x000CFFFF, 0, "GSI2", 2, PrtNode);
+ AmlAddPrtEntry (0x000CFFFF, 0, "GSI3", 3, PrtNode);
+
+ AmlAddPrtEntry (0x000DFFFF, 0, "GSI1", 0, PrtNode);
+ AmlAddPrtEntry (0x000DFFFF, 0, "GSI2", 1, PrtNode);
+ AmlAddPrtEntry (0x000DFFFF, 0, "GSI3", 2, PrtNode);
+ AmlAddPrtEntry (0x000DFFFF, 0, "GSI0", 3, PrtNode);
+
+ AmlAddPrtEntry (0x000EFFFF, 0, "GSI2", 0, PrtNode);
+ AmlAddPrtEntry (0x000EFFFF, 0, "GSI3", 1, PrtNode);
+ AmlAddPrtEntry (0x000EFFFF, 0, "GSI0", 2, PrtNode);
+ AmlAddPrtEntry (0x000EFFFF, 0, "GSI1", 3, PrtNode);
+
+ AmlAddPrtEntry (0x000FFFFF, 0, "GSI3", 0, PrtNode);
+ AmlAddPrtEntry (0x000FFFFF, 0, "GSI0", 1, PrtNode);
+ AmlAddPrtEntry (0x000FFFFF, 0, "GSI1", 2, PrtNode);
+ AmlAddPrtEntry (0x000FFFFF, 0, "GSI2", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0010FFFF, 0, "GSI0", 0, PrtNode);
+ AmlAddPrtEntry (0x0010FFFF, 0, "GSI1", 1, PrtNode);
+ AmlAddPrtEntry (0x0010FFFF, 0, "GSI2", 2, PrtNode);
+ AmlAddPrtEntry (0x0010FFFF, 0, "GSI3", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0011FFFF, 0, "GSI1", 0, PrtNode);
+ AmlAddPrtEntry (0x0011FFFF, 0, "GSI2", 1, PrtNode);
+ AmlAddPrtEntry (0x0011FFFF, 0, "GSI3", 2, PrtNode);
+ AmlAddPrtEntry (0x0011FFFF, 0, "GSI0", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0012FFFF, 0, "GSI2", 0, PrtNode);
+ AmlAddPrtEntry (0x0012FFFF, 0, "GSI3", 1, PrtNode);
+ AmlAddPrtEntry (0x0012FFFF, 0, "GSI0", 2, PrtNode);
+ AmlAddPrtEntry (0x0012FFFF, 0, "GSI1", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0013FFFF, 0, "GSI3", 0, PrtNode);
+ AmlAddPrtEntry (0x0013FFFF, 0, "GSI0", 1, PrtNode);
+ AmlAddPrtEntry (0x0013FFFF, 0, "GSI1", 2, PrtNode);
+ AmlAddPrtEntry (0x0013FFFF, 0, "GSI2", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0014FFFF, 0, "GSI0", 0, PrtNode);
+ AmlAddPrtEntry (0x0014FFFF, 0, "GSI1", 1, PrtNode);
+ AmlAddPrtEntry (0x0014FFFF, 0, "GSI2", 2, PrtNode);
+ AmlAddPrtEntry (0x0014FFFF, 0, "GSI3", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0015FFFF, 0, "GSI1", 0, PrtNode);
+ AmlAddPrtEntry (0x0015FFFF, 0, "GSI2", 1, PrtNode);
+ AmlAddPrtEntry (0x0015FFFF, 0, "GSI3", 2, PrtNode);
+ AmlAddPrtEntry (0x0015FFFF, 0, "GSI0", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0016FFFF, 0, "GSI2", 0, PrtNode);
+ AmlAddPrtEntry (0x0016FFFF, 0, "GSI3", 1, PrtNode);
+ AmlAddPrtEntry (0x0016FFFF, 0, "GSI0", 2, PrtNode);
+ AmlAddPrtEntry (0x0016FFFF, 0, "GSI1", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0017FFFF, 0, "GSI3", 0, PrtNode);
+ AmlAddPrtEntry (0x0017FFFF, 0, "GSI0", 1, PrtNode);
+ AmlAddPrtEntry (0x0017FFFF, 0, "GSI1", 2, PrtNode);
+ AmlAddPrtEntry (0x0017FFFF, 0, "GSI2", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0018FFFF, 0, "GSI0", 0, PrtNode);
+ AmlAddPrtEntry (0x0018FFFF, 0, "GSI1", 1, PrtNode);
+ AmlAddPrtEntry (0x0018FFFF, 0, "GSI2", 2, PrtNode);
+ AmlAddPrtEntry (0x0018FFFF, 0, "GSI3", 3, PrtNode);
+
+ AmlAddPrtEntry (0x0019FFFF, 0, "GSI1", 0, PrtNode);
+ AmlAddPrtEntry (0x0019FFFF, 0, "GSI2", 1, PrtNode);
+ AmlAddPrtEntry (0x0019FFFF, 0, "GSI3", 2, PrtNode);
+ AmlAddPrtEntry (0x0019FFFF, 0, "GSI0", 3, PrtNode);
+
+ AmlAddPrtEntry (0x001AFFFF, 0, "GSI2", 0, PrtNode);
+ AmlAddPrtEntry (0x001AFFFF, 0, "GSI3", 1, PrtNode);
+ AmlAddPrtEntry (0x001AFFFF, 0, "GSI0", 2, PrtNode);
+ AmlAddPrtEntry (0x001AFFFF, 0, "GSI1", 3, PrtNode);
+
+ AmlAddPrtEntry (0x001BFFFF, 0, "GSI3", 0, PrtNode);
+ AmlAddPrtEntry (0x001BFFFF, 0, "GSI0", 1, PrtNode);
+ AmlAddPrtEntry (0x001BFFFF, 0, "GSI1", 2, PrtNode);
+ AmlAddPrtEntry (0x001BFFFF, 0, "GSI2", 3, PrtNode);
+
+ AmlAddPrtEntry (0x001CFFFF, 0, "GSI0", 0, PrtNode);
+ AmlAddPrtEntry (0x001CFFFF, 0, "GSI1", 1, PrtNode);
+ AmlAddPrtEntry (0x001CFFFF, 0, "GSI2", 2, PrtNode);
+ AmlAddPrtEntry (0x001CFFFF, 0, "GSI3", 3, PrtNode);
+
+ AmlAddPrtEntry (0x001DFFFF, 0, "GSI1", 0, PrtNode);
+ AmlAddPrtEntry (0x001DFFFF, 0, "GSI2", 1, PrtNode);
+ AmlAddPrtEntry (0x001DFFFF, 0, "GSI3", 2, PrtNode);
+ AmlAddPrtEntry (0x001DFFFF, 0, "GSI0", 3, PrtNode);
+
+ AmlAddPrtEntry (0x001EFFFF, 0, "GSI2", 0, PrtNode);
+ AmlAddPrtEntry (0x001EFFFF, 0, "GSI3", 1, PrtNode);
+ AmlAddPrtEntry (0x001EFFFF, 0, "GSI0", 2, PrtNode);
+ AmlAddPrtEntry (0x001EFFFF, 0, "GSI1", 3, PrtNode);
+
+ AmlAddPrtEntry (0x001FFFFF, 0, "GSI3", 0, PrtNode);
+ AmlAddPrtEntry (0x001FFFFF, 0, "GSI0", 1, PrtNode);
+ AmlAddPrtEntry (0x001FFFFF, 0, "GSI1", 2, PrtNode);
+ AmlAddPrtEntry (0x001FFFFF, 0, "GSI2", 3, PrtNode);
+}
+
+EFI_STATUS
+PciGetProtocolAndResource (
+ IN EFI_HANDLE Handle,
+ OUT EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL **IoDev,
+ OUT EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR **Descriptors
+ )
+{
+ EFI_STATUS Status;
+
+ //
+ // Get inferface from protocol
+ //
+ Status = gBS->HandleProtocol (
+ Handle,
+ &gEfiPciRootBridgeIoProtocolGuid,
+ (VOID **)IoDev
+ );
+
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ //
+ // Call Configuration() to get address space descriptors
+ //
+ Status = (*IoDev)->Configuration (*IoDev, (VOID **)Descriptors);
+ if (Status == EFI_UNSUPPORTED) {
+ *Descriptors = NULL;
+ return EFI_SUCCESS;
+ } else {
+ return Status;
+ }
+}
+
+EFI_STATUS
+AddPcieHostBridges (
+ AML_OBJECT_NODE_HANDLE ScopeNode
+ )
+{
+ UINTN HandleBufSize;
+ EFI_HANDLE *HandleBuf;
+ UINTN HandleCount;
+ EFI_STATUS Status;
+ UINTN Index;
+
+ EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev;
+ EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptors;
+
+ AML_OBJECT_NODE_HANDLE PciNode;
+ AML_OBJECT_NODE_HANDLE ResNode;
+ AML_OBJECT_NODE_HANDLE RbufRt;
+ AML_OBJECT_NODE_HANDLE ResRt;
+ UINT64 PcieDeviceStatus;
+ UINT32 EisaId;
+ CHAR8 DeviceName[5];
+
+ HandleBufSize = sizeof (EFI_HANDLE);
+ HandleBuf = (EFI_HANDLE *)AllocateZeroPool (HandleBufSize);
+ if (HandleBuf == NULL) {
+ DEBUG ((DEBUG_ERROR, "Failed to allocate memory\n"));
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Status = gBS->LocateHandle (
+ ByProtocol,
+ &gEfiPciRootBridgeIoProtocolGuid,
+ NULL,
+ &HandleBufSize,
+ HandleBuf
+ );
+
+ if (Status == EFI_BUFFER_TOO_SMALL) {
+ HandleBuf = ReallocatePool (sizeof (EFI_HANDLE), HandleBufSize, HandleBuf);
+ if (HandleBuf == NULL) {
+ DEBUG ((DEBUG_ERROR, "Failed to allocate memory\n"));
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Status = gBS->LocateHandle (
+ ByProtocol,
+ &gEfiPciRootBridgeIoProtocolGuid,
+ NULL,
+ &HandleBufSize,
+ HandleBuf
+ );
+ }
+
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to locate PciRootBridge\n"));
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ HandleCount = HandleBufSize / sizeof (EFI_HANDLE);
+
+ for (Index = 0; Index < HandleCount; Index++) {
+ AsciiSPrint (DeviceName, sizeof (DeviceName), "PCI%x", Index);
+ AmlCodeGenDevice (DeviceName, ScopeNode, &PciNode);
+ Status = AmlGetEisaIdFromString ("PNP0A08", &EisaId);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ return Status;
+ }
+
+ AmlCodeGenNameInteger ("_HID", EisaId, PciNode, NULL);
+ Status = AmlGetEisaIdFromString ("PNP0A03", &EisaId);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ return Status;
+ }
+
+ AmlCodeGenNameInteger ("_CID", EisaId, PciNode, NULL);
+ AmlCodeGenNameInteger ("_SEG", 0, PciNode, NULL);
+ AmlCodeGenNameInteger ("_CCA", 1, PciNode, NULL);
+ AmlCodeGenNameString ("_UID", DeviceName, PciNode, NULL);
+
+ GenPciLinkDevice (PciNode, 0, "GSI0", 0x23);
+ GenPciLinkDevice (PciNode, 0, "GSI1", 0x24);
+ GenPciLinkDevice (PciNode, 0, "GSI2", 0x25);
+ GenPciLinkDevice (PciNode, 0, "GSI3", 0x26);
+
+ GenPrtEntries (PciNode);
+ AmlCodeGenNameResourceTemplate ("RBUF", PciNode, &RbufRt);
+ AmlCodeGenMethodRetInteger ("_CBA", PcdGet64 (PcdPciExpressBaseAddress), 0, FALSE, 0, PciNode, NULL);
+
+ Status = PciGetProtocolAndResource (
+ HandleBuf[Index],
+ &IoDev,
+ &Descriptors
+ );
+
+ while ((*Descriptors).Desc != ACPI_END_TAG_DESCRIPTOR) {
+ if (((*Descriptors).ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) &&
+ ((*Descriptors).AddrSpaceGranularity == 0x20))
+ {
+ AmlCodeGenRdDWordMemory (
+ FALSE,
+ TRUE,
+ TRUE,
+ TRUE,
+ 1,
+ TRUE,
+ 0,
+ (*Descriptors).AddrRangeMin,
+ (*Descriptors).AddrRangeMax,
+ 0,
+ (*Descriptors).AddrRangeMax - (*Descriptors).AddrRangeMin + 1,
+ 0,
+ NULL,
+ 0,
+ TRUE,
+ RbufRt,
+ NULL
+ );
+ }
+
+ if (((*Descriptors).ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) &&
+ ((*Descriptors).AddrSpaceGranularity == 0x40))
+ {
+ AmlCodeGenRdQWordMemory (
+ FALSE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ 0,
+ (*Descriptors).AddrRangeMin,
+ (*Descriptors).AddrRangeMax,
+ 0,
+ (*Descriptors).AddrRangeMax - (*Descriptors).AddrRangeMin + 1,
+ 0,
+ NULL,
+ 0,
+ TRUE,
+ RbufRt,
+ NULL
+ );
+ }
+
+ if ((*Descriptors).ResType == ACPI_ADDRESS_SPACE_TYPE_IO) {
+ AmlCodeGenRdDWordIo (
+ FALSE,
+ TRUE,
+ TRUE,
+ TRUE,
+ 3,
+ 0,
+ (*Descriptors).AddrRangeMin,
+ (*Descriptors).AddrRangeMax,
+ 0,
+ (*Descriptors).AddrRangeMax - (*Descriptors).AddrRangeMin + 1,
+ 0,
+ NULL,
+ FALSE,
+ TRUE,
+ RbufRt,
+ NULL
+ );
+ }
+
+ if ((*Descriptors).ResType == ACPI_ADDRESS_SPACE_TYPE_BUS) {
+ AmlCodeGenNameInteger ("_BBN", (*Descriptors).AddrRangeMin, PciNode, NULL);
+ AmlCodeGenRdWordBusNumber (
+ FALSE,
+ TRUE,
+ TRUE,
+ TRUE,
+ 0,
+ (*Descriptors).AddrRangeMin,
+ (*Descriptors).AddrRangeMax,
+ 0,
+ (*Descriptors).AddrRangeMax - (*Descriptors).AddrRangeMin + 1,
+ 0,
+ NULL,
+ RbufRt,
+ NULL
+ );
+ }
+
+ (Descriptors)++;
+ }
+
+ DEBUG ((DEBUG_INFO, "\n"));
+
+ AmlCodeGenMethodRetNameString ("_CRS", "RBUF", 0, TRUE, 0, PciNode, NULL);
+ PcieDeviceStatus = 0xF; // STATUS_PRESENT | STATUS_ENABLED | STATUS_SHOWN_IN_UI | STATUS_FUNCTIONING;
+ AmlCodeGenMethodRetInteger ("_STA", PcieDeviceStatus, 0, TRUE, 0, PciNode, NULL);
+
+ AmlCodeGenNameInteger ("SUPP", 0, PciNode, NULL);
+ AmlCodeGenNameInteger ("CTRL", 0, PciNode, NULL);
+
+ AddOscMethod (PciNode);
+
+ if (Index == 0) {
+ // first node
+ AmlCodeGenDevice ("RES0", PciNode, &ResNode);
+ Status = AmlGetEisaIdFromString ("PNP0C02", &EisaId);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ return Status;
+ }
+
+ AmlCodeGenNameInteger ("_HID", EisaId, ResNode, NULL);
+
+ AmlCodeGenNameResourceTemplate ("_CRS", ResNode, &ResRt);
+ AmlCodeGenRdQWordMemory (
+ FALSE,
+ TRUE,
+ TRUE,
+ TRUE,
+ FALSE,
+ TRUE,
+ 0,
+ PcdGet64 (PcdPciExpressBaseAddress), // Range Minimum
+ PcdGet64 (PcdPciExpressBarLimit), // Range Maximum
+ 0x0000000000000000, // Translation Offset
+ PcdGet64 (PcdPciExpressBarSize), // Length
+ // Bridge->Mem.Base,
+ // Bridge->Mem.Limit,
+ // FixedPcdGet32 (PcdPciMmio32Translation),
+ // Bridge->Mem.Limit - Bridge->Mem.Base + 1,
+ 0,
+ NULL /* ResourceSource */,
+ 0 /* MemoryRangeType */,
+ TRUE /* IsTypeStatic */,
+ ResRt,
+ NULL
+ );
+ }
+ }
+
+ return EFI_SUCCESS;
+}
diff --git a/Silicon/Qemu/SbsaQemu/AcpiTables/Dsdt.asl b/Silicon/Qemu/SbsaQemu/AcpiTables/Dsdt.asl
index c134fb66e860..1c8d4fe4f647 100644
--- a/Silicon/Qemu/SbsaQemu/AcpiTables/Dsdt.asl
+++ b/Silicon/Qemu/SbsaQemu/AcpiTables/Dsdt.asl
@@ -181,307 +181,5 @@ DefinitionBlock ("DsdtTable.aml", "DSDT",
} // USB0_RHUB_HUB1
} // USB0_RHUB
} // USB0
-
- Device (PCI0)
- {
- Name (_HID, EISAID ("PNP0A08")) // PCI Express Root Bridge
- Name (_CID, EISAID ("PNP0A03")) // Compatible PCI Root Bridge
- Name (_SEG, Zero) // PCI Segment Group number
- Name (_BBN, Zero) // PCI Base Bus Number
- Name (_UID, "PCI0")
- Name (_CCA, One) // Initially mark the PCI coherent (for JunoR1)
-
- Method (_STA) {
- Return (0xF)
- }
-
- Method (_CBA, 0, NotSerialized) {
- return (FixedPcdGet32 (PcdPciExpressBaseAddress))
- }
-
- LINK_DEVICE(0, GSI0, 0x23)
- LINK_DEVICE(1, GSI1, 0x24)
- LINK_DEVICE(2, GSI2, 0x25)
- LINK_DEVICE(3, GSI3, 0x26)
-
- Name (_PRT, Package () // _PRT: PCI Routing Table
- {
- PRT_ENTRY(0x0000FFFF, 0, GSI0),
- PRT_ENTRY(0x0000FFFF, 0, GSI1),
- PRT_ENTRY(0x0000FFFF, 0, GSI2),
- PRT_ENTRY(0x0000FFFF, 0, GSI3),
-
- PRT_ENTRY(0x0001FFFF, 0, GSI1),
- PRT_ENTRY(0x0001FFFF, 1, GSI2),
- PRT_ENTRY(0x0001FFFF, 2, GSI3),
- PRT_ENTRY(0x0001FFFF, 3, GSI0),
-
- PRT_ENTRY(0x0002FFFF, 0, GSI2),
- PRT_ENTRY(0x0002FFFF, 1, GSI3),
- PRT_ENTRY(0x0002FFFF, 2, GSI0),
- PRT_ENTRY(0x0002FFFF, 3, GSI1),
-
- PRT_ENTRY(0x0003FFFF, 0, GSI3),
- PRT_ENTRY(0x0003FFFF, 1, GSI0),
- PRT_ENTRY(0x0003FFFF, 2, GSI1),
- PRT_ENTRY(0x0003FFFF, 3, GSI2),
-
- PRT_ENTRY(0x0004FFFF, 0, GSI0),
- PRT_ENTRY(0x0004FFFF, 1, GSI1),
- PRT_ENTRY(0x0004FFFF, 2, GSI2),
- PRT_ENTRY(0x0004FFFF, 3, GSI3),
-
- PRT_ENTRY(0x0005FFFF, 0, GSI1),
- PRT_ENTRY(0x0005FFFF, 1, GSI2),
- PRT_ENTRY(0x0005FFFF, 2, GSI3),
- PRT_ENTRY(0x0005FFFF, 3, GSI0),
-
- PRT_ENTRY(0x0006FFFF, 0, GSI2),
- PRT_ENTRY(0x0006FFFF, 1, GSI3),
- PRT_ENTRY(0x0006FFFF, 2, GSI0),
- PRT_ENTRY(0x0006FFFF, 3, GSI1),
-
- PRT_ENTRY(0x0007FFFF, 0, GSI3),
- PRT_ENTRY(0x0007FFFF, 1, GSI0),
- PRT_ENTRY(0x0007FFFF, 2, GSI1),
- PRT_ENTRY(0x0007FFFF, 3, GSI2),
-
- PRT_ENTRY(0x0008FFFF, 0, GSI0),
- PRT_ENTRY(0x0008FFFF, 1, GSI1),
- PRT_ENTRY(0x0008FFFF, 2, GSI2),
- PRT_ENTRY(0x0008FFFF, 3, GSI3),
-
- PRT_ENTRY(0x0009FFFF, 0, GSI1),
- PRT_ENTRY(0x0009FFFF, 1, GSI2),
- PRT_ENTRY(0x0009FFFF, 2, GSI3),
- PRT_ENTRY(0x0009FFFF, 3, GSI0),
-
- PRT_ENTRY(0x000AFFFF, 0, GSI2),
- PRT_ENTRY(0x000AFFFF, 1, GSI3),
- PRT_ENTRY(0x000AFFFF, 2, GSI0),
- PRT_ENTRY(0x000AFFFF, 3, GSI1),
-
- PRT_ENTRY(0x000BFFFF, 0, GSI3),
- PRT_ENTRY(0x000BFFFF, 1, GSI0),
- PRT_ENTRY(0x000BFFFF, 2, GSI1),
- PRT_ENTRY(0x000BFFFF, 3, GSI2),
-
- PRT_ENTRY(0x000CFFFF, 0, GSI0),
- PRT_ENTRY(0x000CFFFF, 1, GSI1),
- PRT_ENTRY(0x000CFFFF, 2, GSI2),
- PRT_ENTRY(0x000CFFFF, 3, GSI3),
-
- PRT_ENTRY(0x000DFFFF, 0, GSI1),
- PRT_ENTRY(0x000DFFFF, 1, GSI2),
- PRT_ENTRY(0x000DFFFF, 2, GSI3),
- PRT_ENTRY(0x000DFFFF, 3, GSI0),
-
- PRT_ENTRY(0x000EFFFF, 0, GSI2),
- PRT_ENTRY(0x000EFFFF, 1, GSI3),
- PRT_ENTRY(0x000EFFFF, 2, GSI0),
- PRT_ENTRY(0x000EFFFF, 3, GSI1),
-
- PRT_ENTRY(0x000FFFFF, 0, GSI3),
- PRT_ENTRY(0x000FFFFF, 1, GSI0),
- PRT_ENTRY(0x000FFFFF, 2, GSI1),
- PRT_ENTRY(0x000FFFFF, 3, GSI2),
-
- PRT_ENTRY(0x0010FFFF, 0, GSI0),
- PRT_ENTRY(0x0010FFFF, 1, GSI1),
- PRT_ENTRY(0x0010FFFF, 2, GSI2),
- PRT_ENTRY(0x0010FFFF, 3, GSI3),
-
- PRT_ENTRY(0x0011FFFF, 0, GSI1),
- PRT_ENTRY(0x0011FFFF, 1, GSI2),
- PRT_ENTRY(0x0011FFFF, 2, GSI3),
- PRT_ENTRY(0x0011FFFF, 3, GSI0),
-
- PRT_ENTRY(0x0012FFFF, 0, GSI2),
- PRT_ENTRY(0x0012FFFF, 1, GSI3),
- PRT_ENTRY(0x0012FFFF, 2, GSI0),
- PRT_ENTRY(0x0012FFFF, 3, GSI1),
-
- PRT_ENTRY(0x0013FFFF, 0, GSI3),
- PRT_ENTRY(0x0013FFFF, 1, GSI0),
- PRT_ENTRY(0x0013FFFF, 2, GSI1),
- PRT_ENTRY(0x0013FFFF, 3, GSI2),
-
- PRT_ENTRY(0x0014FFFF, 0, GSI0),
- PRT_ENTRY(0x0014FFFF, 1, GSI1),
- PRT_ENTRY(0x0014FFFF, 2, GSI2),
- PRT_ENTRY(0x0014FFFF, 3, GSI3),
-
- PRT_ENTRY(0x0015FFFF, 0, GSI1),
- PRT_ENTRY(0x0015FFFF, 1, GSI2),
- PRT_ENTRY(0x0015FFFF, 2, GSI3),
- PRT_ENTRY(0x0015FFFF, 3, GSI0),
-
- PRT_ENTRY(0x0016FFFF, 0, GSI2),
- PRT_ENTRY(0x0016FFFF, 1, GSI3),
- PRT_ENTRY(0x0016FFFF, 2, GSI0),
- PRT_ENTRY(0x0016FFFF, 3, GSI1),
-
- PRT_ENTRY(0x0017FFFF, 0, GSI3),
- PRT_ENTRY(0x0017FFFF, 1, GSI0),
- PRT_ENTRY(0x0017FFFF, 2, GSI1),
- PRT_ENTRY(0x0017FFFF, 3, GSI2),
-
- PRT_ENTRY(0x0018FFFF, 0, GSI0),
- PRT_ENTRY(0x0018FFFF, 1, GSI1),
- PRT_ENTRY(0x0018FFFF, 2, GSI2),
- PRT_ENTRY(0x0018FFFF, 3, GSI3),
-
- PRT_ENTRY(0x0019FFFF, 0, GSI1),
- PRT_ENTRY(0x0019FFFF, 1, GSI2),
- PRT_ENTRY(0x0019FFFF, 2, GSI3),
- PRT_ENTRY(0x0019FFFF, 3, GSI0),
-
- PRT_ENTRY(0x001AFFFF, 0, GSI2),
- PRT_ENTRY(0x001AFFFF, 1, GSI3),
- PRT_ENTRY(0x001AFFFF, 2, GSI0),
- PRT_ENTRY(0x001AFFFF, 3, GSI1),
-
- PRT_ENTRY(0x001BFFFF, 0, GSI3),
- PRT_ENTRY(0x001BFFFF, 1, GSI0),
- PRT_ENTRY(0x001BFFFF, 2, GSI1),
- PRT_ENTRY(0x001BFFFF, 3, GSI2),
-
- PRT_ENTRY(0x001CFFFF, 0, GSI0),
- PRT_ENTRY(0x001CFFFF, 1, GSI1),
- PRT_ENTRY(0x001CFFFF, 2, GSI2),
- PRT_ENTRY(0x001CFFFF, 3, GSI3),
-
- PRT_ENTRY(0x001DFFFF, 0, GSI1),
- PRT_ENTRY(0x001DFFFF, 1, GSI2),
- PRT_ENTRY(0x001DFFFF, 2, GSI3),
- PRT_ENTRY(0x001DFFFF, 3, GSI0),
-
- PRT_ENTRY(0x001EFFFF, 0, GSI2),
- PRT_ENTRY(0x001EFFFF, 1, GSI3),
- PRT_ENTRY(0x001EFFFF, 2, GSI0),
- PRT_ENTRY(0x001EFFFF, 3, GSI1),
-
- PRT_ENTRY(0x001FFFFF, 0, GSI3),
- PRT_ENTRY(0x001FFFFF, 1, GSI0),
- PRT_ENTRY(0x001FFFFF, 2, GSI1),
- PRT_ENTRY(0x001FFFFF, 3, GSI2),
- })
-
- // Root complex resources
- Name (_CRS, ResourceTemplate () {
- WordBusNumber ( // Bus numbers assigned to this root
- ResourceProducer,
- MinFixed, MaxFixed, PosDecode,
- 0, // AddressGranularity
- FixedPcdGet32 (PcdPciBusMin), // AddressMinimum - Minimum Bus Number
- FixedPcdGet32 (PcdPciBusMax), // AddressMaximum - Maximum Bus Number
- 0, // AddressTranslation - Set to 0
- 256 // RangeLength - Number of Busses
- )
-
- DWordMemory ( // 32-bit BAR Windows
- ResourceProducer, PosDecode,
- MinFixed, MaxFixed,
- Cacheable, ReadWrite,
- 0x00000000, // Granularity
- FixedPcdGet32 (PcdPciMmio32Base), // Min Base Address
- FixedPcdGet32 (PcdPciMmio32Limit), // Max Base Address
- FixedPcdGet32 (PcdPciMmio32Translation), // Translate
- FixedPcdGet32 (PcdPciMmio32Size) // Length
- )
-
- QWordMemory ( // 64-bit BAR Windows
- ResourceProducer, PosDecode,
- MinFixed, MaxFixed,
- Cacheable, ReadWrite,
- 0x00000000, // Granularity
- FixedPcdGet64 (PcdPciMmio64Base), // Min Base Address
- FixedPcdGet64 (PcdPciMmio64Limit), // Max Base Address
- FixedPcdGet64 (PcdPciMmio64Translation), // Translate
- FixedPcdGet64 (PcdPciMmio64Size) // Length
- )
-
- DWordIo ( // IO window
- ResourceProducer,
- MinFixed,
- MaxFixed,
- PosDecode,
- EntireRange,
- 0x00000000, // Granularity
- FixedPcdGet32 (PcdPciIoBase), // Min Base Address
- FixedPcdGet32 (PcdPciIoLimit), // Max Base Address
- FixedPcdGet32 (PcdPciIoTranslation), // Translate
- FixedPcdGet32 (PcdPciIoSize), // Length
- ,,,TypeTranslation
- )
- }) // Name(_CRS)
-
- Device (RES0)
- {
- Name (_HID, "PNP0C02" /* PNP Motherboard Resources */) // _HID: Hardware ID
- Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
- {
- QWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
- 0x0000000000000000, // Granularity
- FixedPcdGet64 (PcdPciExpressBaseAddress), // Range Minimum
- FixedPcdGet64 (PcdPciExpressBarLimit), // Range Maximum
- 0x0000000000000000, // Translation Offset
- FixedPcdGet64 (PcdPciExpressBarSize), // Length
- ,, , AddressRangeMemory, TypeStatic)
- })
- Method (_STA) {
- Return (0xF)
- }
- }
-
- // OS Control Handoff
- Name (SUPP, Zero) // PCI _OSC Support Field value
- Name (CTRL, Zero) // PCI _OSC Control Field value
-
- /*
- * See [1] 6.2.10, [2] 4.5
- */
- Method (_OSC,4) {
- // Check for proper UUID
- If (Arg0 == ToUUID("33DB4D5B-1FF7-401C-9657-7441C03DD766")) {
- // Create DWord-adressable fields from the Capabilities Buffer
- CreateDWordField (Arg3,0,CDW1)
- CreateDWordField (Arg3,4,CDW2)
- CreateDWordField (Arg3,8,CDW3)
-
- // 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 ((SUPP & 0x16) != 0x16) {
- CTRL &= 0x1E // Mask bit 0 (and undefined bits)
- }
-
- // Always allow native PME, AER (no dependencies)
-
- // Never allow SHPC (no SHPC controller in this system)
- CTRL &= 0x1D
-
- If (Arg1 != One) { // Unknown revision
- CDW1 |= 0x08
- }
-
- If (CDW3 != CTRL) { // Capabilities bits were masked
- CDW1 |= 0x10
- }
-
- // Update DWORD3 in the buffer
- Store (CTRL,CDW3)
- Return (Arg3)
- } Else {
- CDW1 |= 4 // Unrecognized UUID
- Return (Arg3)
- }
- } // End _OSC
- }
} // Scope (_SB)
}
diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SsdtTemplate.asl b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SsdtTemplate.asl
new file mode 100644
index 000000000000..2fcdb607d173
--- /dev/null
+++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SsdtTemplate.asl
@@ -0,0 +1,82 @@
+/** @file
+* Differentiated System Description Table Fields (DSDT).
+*
+* Copyright (c) 2024, Linaro Ltd. All rights reserved.
+*
+* SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <IndustryStandard/Acpi63.h>
+#include <IndustryStandard/SbsaQemuAcpi.h>
+
+#define LINK_DEVICE(Uid, LinkName, Irq) \
+ Device (LinkName) { \
+ Name (_HID, EISAID("PNP0C0F")) \
+ Name (_UID, Uid) \
+ Name (_PRS, ResourceTemplate() { \
+ Interrupt (ResourceProducer, Level, ActiveHigh, Exclusive) { Irq } \
+ }) \
+ Method (_CRS, 0) { Return (_PRS) } \
+ Method (_SRS, 1) { } \
+ Method (_DIS) { } \
+ }
+
+#define PRT_ENTRY(Address, Pin, Link) \
+ Package (4) { \
+ Address, Pin, Link, Zero \
+ }
+
+DefinitionBlock ("Dsdt.aml", "DSDT",
+ EFI_ACPI_6_3_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_REVISION,
+ "LINARO", "SBSAQEMU", FixedPcdGet32 (PcdAcpiDefaultOemRevision)) {
+ /*
+ * See [1] 6.2.10, [2] 4.5
+ */
+ Name (SUPP, Zero) // PCI _OSC Support Field value
+ Name (CTRL, Zero) // PCI _OSC Control Field value
+ Method (_OSC, 4, Serialized) {
+ //
+ // OS Control Handoff
+ //
+
+ // Check for proper UUID
+ If (Arg0 == ToUUID("33DB4D5B-1FF7-401C-9657-7441C03DD766")) {
+ // Create DWord-adressable fields from the Capabilities Buffer
+ CreateDWordField (Arg3,0,CDW1)
+ CreateDWordField (Arg3,4,CDW2)
+ CreateDWordField (Arg3,8,CDW3)
+
+ // 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 ((SUPP & 0x16) != 0x16) {
+ CTRL |= 0x1E // Mask bit 0 (and undefined bits)
+ }
+
+ // Always allow native PME, AER (no dependencies)
+
+ // Never allow SHPC (no SHPC controller in this system)
+ CTRL &= 0x1D
+
+ If (Arg1 != One) { // Unknown revision
+ CDW1 |= 0x08
+ }
+
+ If (CDW3 != CTRL) { // Capabilities bits were masked
+ CDW1 |= 0x10
+ }
+
+ // Update DWORD3 in the buffer
+ Store (CTRL,CDW3)
+ Return (Arg3)
+ } Else {
+ CDW1 |= 4 // Unrecognized UUID
+ Return (Arg3)
+ }
+ } // End _OSC
+}
--
2.44.0
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#118290): https://edk2.groups.io/g/devel/message/118290
Mute This Topic: https://groups.io/mt/105728626/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
next prev parent reply other threads:[~2024-04-25 12:03 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-25 12:02 [edk2-devel] [PATCH WIP edk2-platforms 0/3] SbsaQemu: add support for multiple PCI Express buses Marcin Juszkiewicz
2024-04-25 12:02 ` [edk2-devel] [PATCH edk2-platforms WIP 1/3] SbsaQemu: scan for PCIe buses Marcin Juszkiewicz
2024-04-25 12:02 ` Marcin Juszkiewicz [this message]
2024-04-25 12:02 ` [edk2-devel] [PATCH edk2-platforms WIP 3/3] SbsaQemu: generate MCFG table Marcin Juszkiewicz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240425-review-multiple-pcie-0425-v1-2-68fdfd781f9e@linaro.org \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox