If firmware is used with QEMU 8.0 or older then there will be no GIC ITS
support.
In such case we would not add information about it into MCFG and there
will be no IORT table.
Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
---
.../Qemu/SbsaQemu/AcpiTables/AcpiTables.inf | 1 -
.../SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf | 1 +
.../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c | 218 +++++++++++++++++-
Silicon/Qemu/SbsaQemu/AcpiTables/Iort.aslc | 135 -----------
4 files changed, 208 insertions(+), 147 deletions(-)
delete mode 100644 Silicon/Qemu/SbsaQemu/AcpiTables/Iort.aslc
diff --git a/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf b/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf
index 554c5e4b6f9e..97021f7971c7 100644
--- a/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf
+++ b/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf
@@ -22,7 +22,6 @@ [Sources]
Gtdt.aslc
Mcfg.aslc
Spcr.aslc
- Iort.aslc
[Packages]
ArmPlatformPkg/ArmPlatformPkg.dec
diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
index 3ec7ffd8dd5c..14d760b36400 100644
--- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
+++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
@@ -49,6 +49,7 @@ [Pcd]
gArmTokenSpaceGuid.PcdGicDistributorBase
gArmTokenSpaceGuid.PcdGicRedistributorsBase
gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdGicItsBase
+ gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdSmmuBase
[Depex]
gEfiAcpiTableProtocolGuid ## CONSUMES
diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
index 961482269678..bd3ba75f52fa 100644
--- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
+++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
@@ -8,6 +8,7 @@
**/
#include <IndustryStandard/Acpi.h>
#include <IndustryStandard/AcpiAml.h>
+#include <IndustryStandard/IoRemappingTable.h>
#include <IndustryStandard/SbsaQemuAcpi.h>
#include <Library/AcpiLib.h>
#include <Library/BaseMemoryLib.h>
@@ -21,6 +22,36 @@
#include <Library/UefiLib.h>
#include <Protocol/AcpiTable.h>
+#pragma pack(1)
+
+typedef struct {
+ EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE Node;
+ UINT32 Identifiers;
+} SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE;
+
+typedef struct
+{
+ EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE SmmuNode;
+ EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE SmmuIdMap;
+} SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE;
+
+typedef struct
+{
+ EFI_ACPI_6_0_IO_REMAPPING_RC_NODE RcNode;
+ EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE RcIdMap;
+} SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE;
+
+typedef struct {
+ EFI_ACPI_6_0_IO_REMAPPING_TABLE Iort;
+ SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE ItsNode;
+ SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE SmmuNode;
+ SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE RcNode;
+} SBSA_IO_REMAPPING_STRUCTURE;
+
+static UINTN GicItsBase;
+
+#pragma pack ()
+
/*
* A Function to Compute the ACPI Table Checksum
*/
@@ -40,6 +71,159 @@ AcpiPlatformChecksum (
Buffer[ChecksumOffset] = CalculateCheckSum8(Buffer, Size);
}
+/*
+ * A function that add the IORT ACPI table.
+ IN EFI_ACPI_COMMON_HEADER *CurrentTable
+ */
+EFI_STATUS
+AddIortTable (
+ IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable
+ )
+{
+ EFI_STATUS Status;
+ UINTN TableHandle;
+ UINT32 TableSize;
+ EFI_PHYSICAL_ADDRESS PageAddress;
+ UINT8 *New;
+
+ // Initialize IORT ACPI Header
+ EFI_ACPI_6_0_IO_REMAPPING_TABLE Header = {
+ SBSAQEMU_ACPI_HEADER(EFI_ACPI_6_0_IO_REMAPPING_TABLE_SIGNATURE,
+ SBSA_IO_REMAPPING_STRUCTURE,
+ EFI_ACPI_IO_REMAPPING_TABLE_REVISION_00),
+ 3,
+ sizeof(EFI_ACPI_6_0_IO_REMAPPING_TABLE), // NodeOffset
+ 0 };
+
+ // Initialize SMMU3 Structure
+ SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE Smmu3 = {
+ {
+ {
+ EFI_ACPI_IORT_TYPE_SMMUv3,
+ sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE),
+ 2, // Revision
+ 0, // Reserved
+ 1, // NumIdMapping
+ OFFSET_OF (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE, SmmuIdMap) // IdReference
+ },
+ PcdGet64 (PcdSmmuBase), // Base address
+ EFI_ACPI_IORT_SMMUv3_FLAG_COHAC_OVERRIDE, // Flags
+ 0, // Reserved
+ 0, // VATOS address
+ EFI_ACPI_IORT_SMMUv3_MODEL_GENERIC, // SMMUv3 Model
+ 74, // Event
+ 75, // Pri
+ 77, // Gerror
+ 76, // Sync
+ 0, // Proximity domain
+ 1 // DevIDMappingIndex
+ },
+ {
+ 0x0000, // InputBase
+ 0xffff, // NumIds
+ 0x0000, // OutputBase
+ OFFSET_OF (SBSA_IO_REMAPPING_STRUCTURE, ItsNode), // OutputReference
+ 0 // Flags
+ }
+ };
+
+//NOTE(hrw): update to IORT E.e?
+ SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE Rc = {
+ {
+ {
+ EFI_ACPI_IORT_TYPE_ROOT_COMPLEX, // Type
+ sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE), // Length
+ 0, // Revision
+ 0, // Reserved
+ 1, // NumIdMappings
+ OFFSET_OF (SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE, RcIdMap) // IdReference
+ },
+ 1, // CacheCoherent
+ 0, // AllocationHints
+ 0, // Reserved
+ 0, // MemoryAccessFlags
+ EFI_ACPI_IORT_ROOT_COMPLEX_ATS_UNSUPPORTED, // AtsAttribute
+ 0x0, // PciSegmentNumber
+ //0, //MemoryAddressSizeLimit
+ },
+ {
+ 0x0000, // InputBase
+ 0xffff, // NumIds
+ 0x0000, // OutputBase
+ OFFSET_OF (SBSA_IO_REMAPPING_STRUCTURE, SmmuNode), // OutputReference
+ 0, // Flags
+ }
+ };
+
+ SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE Its = {
+ // EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE
+ {
+ // EFI_ACPI_6_0_IO_REMAPPING_NODE
+ {
+ EFI_ACPI_IORT_TYPE_ITS_GROUP, // Type
+ sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE), // Length
+ 0, // Revision
+ 0, // Identifier
+ 0, // NumIdMappings
+ 0, // IdReference
+ },
+ 1, // ITS count
+ },
+ 0, // GIC ITS Identifiers
+ };
+
+ // Calculate the new table size based on the number of cores
+ TableSize = sizeof (EFI_ACPI_6_0_IO_REMAPPING_TABLE) +
+ sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE) +
+ sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE) +
+ sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE);
+
+ Status = gBS->AllocatePages (
+ AllocateAnyPages,
+ EfiACPIReclaimMemory,
+ EFI_SIZE_TO_PAGES (TableSize),
+ &PageAddress
+ );
+ if (EFI_ERROR(Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to allocate pages for IORT table\n"));
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ New = (UINT8 *)(UINTN) PageAddress;
+ ZeroMem (New, TableSize);
+
+ // Add the ACPI Description table header
+ CopyMem (New, &Header, sizeof (EFI_ACPI_6_0_IO_REMAPPING_TABLE));
+ ((EFI_ACPI_DESCRIPTION_HEADER*) New)->Length = TableSize;
+ New += sizeof (EFI_ACPI_6_0_IO_REMAPPING_TABLE);
+
+ // ITS Node
+ CopyMem (New, &Its, sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE));
+ New += sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE);
+
+ // SMMUv3 Node
+ CopyMem (New, &Smmu3, sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE));
+ New += sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE);
+
+ // RC Node
+ 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);
+
+ Status = AcpiTable->InstallAcpiTable (
+ AcpiTable,
+ (EFI_ACPI_COMMON_HEADER *)PageAddress,
+ TableSize,
+ &TableHandle
+ );
+ if (EFI_ERROR(Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to install IORT table\n"));
+ }
+
+ return Status;
+}
+
/*
* A function that add the MADT ACPI table.
IN EFI_ACPI_COMMON_HEADER *CurrentTable
@@ -91,11 +275,6 @@ AddMadtTable (
// Initialize GIC Redistributor Structure
EFI_ACPI_6_0_GICR_STRUCTURE Gicr = SBSAQEMU_MADT_GICR_INIT();
- // Initialize GIC ITS Structure
- EFI_ACPI_6_5_GIC_ITS_STRUCTURE Gic_Its = SBSAQEMU_MADT_GIC_ITS_INIT(0);
-
- DEBUG ((DEBUG_ERROR, "itsBaseAddr is 0x%4x\n", PcdGet64 (PcdGicItsBase)));
-
// Get CoreCount which was determined eariler after parsing device tree
NumCores = PcdGet32 (PcdCoreCount);
@@ -103,8 +282,14 @@ AddMadtTable (
TableSize = sizeof (EFI_ACPI_6_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER) +
(sizeof (EFI_ACPI_6_0_GIC_STRUCTURE) * NumCores) +
sizeof (EFI_ACPI_6_0_GIC_DISTRIBUTOR_STRUCTURE) +
- sizeof (EFI_ACPI_6_0_GICR_STRUCTURE) +
- sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE);
+ sizeof (EFI_ACPI_6_0_GICR_STRUCTURE);
+
+ // Initialize GIC ITS Structure
+ EFI_ACPI_6_5_GIC_ITS_STRUCTURE Gic_Its = SBSAQEMU_MADT_GIC_ITS_INIT(0);
+
+ if (GicItsBase > 0) {
+ TableSize += sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE);
+ }
Status = gBS->AllocatePages (
AllocateAnyPages,
@@ -144,9 +329,11 @@ AddMadtTable (
CopyMem (New, &Gicr, sizeof (EFI_ACPI_6_0_GICR_STRUCTURE));
New += sizeof (EFI_ACPI_6_0_GICR_STRUCTURE);
- // GIC ITS Structure
- CopyMem (New, &Gic_Its, sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE));
- New += sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE);
+ if (GicItsBase > 0) {
+ // GIC ITS Structure
+ CopyMem (New, &Gic_Its, sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE));
+ New += sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE);
+ }
AcpiPlatformChecksum ((UINT8*) PageAddress, TableSize);
@@ -317,7 +504,7 @@ AddSsdtTable (
}
/*
- * A function that adds the SSDT ACPI table.
+ * A function that adds the PPTT ACPI table.
*/
EFI_STATUS
AddPpttTable (
@@ -448,6 +635,15 @@ InitializeSbsaQemuAcpiDxe (
return Status;
}
+ GicItsBase = PcdGet64 (PcdGicItsBase);
+
+ if (GicItsBase > 0) {
+ Status = AddIortTable (AcpiTable);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to add IORT table\n"));
+ }
+ }
+
Status = AddMadtTable (AcpiTable);
if (EFI_ERROR(Status)) {
DEBUG ((DEBUG_ERROR, "Failed to add MADT table\n"));
diff --git a/Silicon/Qemu/SbsaQemu/AcpiTables/Iort.aslc b/Silicon/Qemu/SbsaQemu/AcpiTables/Iort.aslc
deleted file mode 100644
index ec4ce504efd1..000000000000
--- a/Silicon/Qemu/SbsaQemu/AcpiTables/Iort.aslc
+++ /dev/null
@@ -1,135 +0,0 @@
-/** @file
-
- Copyright (c) 2023, Linaro Ltd. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <IndustryStandard/IoRemappingTable.h>
-#include <IndustryStandard/Acpi.h>
-#include <IndustryStandard/SbsaQemuAcpi.h>
-
-#pragma pack(1)
-
-typedef struct {
- EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE Node;
- UINT32 Identifiers;
-} SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE;
-
-typedef struct
-{
- EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE SmmuNode;
- EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE SmmuIdMap;
-} SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE;
-
-typedef struct
-{
- EFI_ACPI_6_0_IO_REMAPPING_RC_NODE RcNode;
- EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE RcIdMap;
-} SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE;
-
-typedef struct {
- EFI_ACPI_6_0_IO_REMAPPING_TABLE Iort;
- SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE ItsNode;
- SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE SmmuNode;
- SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE RcNode;
-} SBSA_IO_REMAPPING_STRUCTURE;
-
-#pragma pack ()
-
-STATIC SBSA_IO_REMAPPING_STRUCTURE Iort = {
- {
- SBSAQEMU_ACPI_HEADER(EFI_ACPI_6_0_IO_REMAPPING_TABLE_SIGNATURE,
- SBSA_IO_REMAPPING_STRUCTURE,
- EFI_ACPI_IO_REMAPPING_TABLE_REVISION_00),
- 3, // NumNodes
- sizeof(EFI_ACPI_6_0_IO_REMAPPING_TABLE), // NodeOffset
- 0 // Reserved
- },
- // SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE
- {
- // EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE
- {
- // EFI_ACPI_6_0_IO_REMAPPING_NODE
- {
- EFI_ACPI_IORT_TYPE_ITS_GROUP, // Type
- sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE), // Length
- 0, // Revision
- 0, // Reserved
- 0, // NumIdMappings
- 0, // IdReference
- },
- 1, // ITS count
- },
- 0, // GIC ITS Identifiers
- },
- // SMMU
- {
- // EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE
- {
- // EFI_ACPI_6_0_IO_REMAPPING_NODE
- {
- EFI_ACPI_IORT_TYPE_SMMUv3, // Type
- sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE), // Length
- 2, // Revision
- 0, // Reserved
- 1, // NumIdMapping
- OFFSET_OF (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE, SmmuIdMap), // IdReference
- },
- 0x60050000, // Base address
- EFI_ACPI_IORT_SMMUv3_FLAG_COHAC_OVERRIDE, // Flags
- 0, // Reserved
- 0, // VATOS address
- EFI_ACPI_IORT_SMMUv3_MODEL_GENERIC, // SMMUv3 Model
- 74, // Event
- 75, // Pri
- 77, // Gerror
- 76, // Sync
- 0, // Proximity domain
- 1, // DevIDMappingIndex
- },
- // EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE
- {
- 0x0000, // InputBase
- 0xffff, // NumIds
- 0x0000, // OutputBase
- OFFSET_OF (SBSA_IO_REMAPPING_STRUCTURE, ItsNode), // OutputReference
- 0, // Flags
- },
- },
- // SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE
- {
- // EFI_ACPI_6_0_IO_REMAPPING_RC_NODE
- {
- // EFI_ACPI_6_0_IO_REMAPPING_NODE
- {
- EFI_ACPI_IORT_TYPE_ROOT_COMPLEX, // Type
- sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE), // Length
- 0, // Revision
- 0, // Reserved
- 1, // NumIdMappings
- OFFSET_OF (SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE, RcIdMap) // IdReference
- },
- 1, // CacheCoherent
- 0, // AllocationHints
- 0, // Reserved
- 0, // MemoryAccessFlags
- EFI_ACPI_IORT_ROOT_COMPLEX_ATS_UNSUPPORTED, // AtsAttribute
- 0x0, // PciSegmentNumber
- //0, //MemoryAddressSizeLimit
- },
- // EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE
- {
- 0x0000, // InputBase
- 0xffff, // NumIds
- 0x0000, // OutputBase
- OFFSET_OF (SBSA_IO_REMAPPING_STRUCTURE, SmmuNode), // OutputReference
- 0, // Flags
- }
- }
-};
-
-#pragma pack()
-
-VOID* CONST ReferenceAcpiTable = &Iort;
\ No newline at end of file
--
2.41.0
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#107927): https://edk2.groups.io/g/devel/message/107927
Mute This Topic: https://groups.io/mt/100874755/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
On Mon, Aug 21, 2023 at 17:07:57 +0200, Marcin Juszkiewicz wrote:
> If firmware is used with QEMU 8.0 or older then there will be no GIC ITS
> support.
>
> In such case we would not add information about it into MCFG and there
> will be no IORT table.
>
> Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
> ---
> .../Qemu/SbsaQemu/AcpiTables/AcpiTables.inf | 1 -
> .../SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf | 1 +
> .../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c | 218 +++++++++++++++++-
> Silicon/Qemu/SbsaQemu/AcpiTables/Iort.aslc | 135 -----------
Hmm, wait. Patch 1/3 adds Iort.aslc and patch 3/3 deletes it.
I know 1/3 is Shashi's original implementation and 3/3 is heavily
based on that (if rewritten), but there's no point in merging the
churn.
What does this set look like as a single squashed patch?
(I think doing that would also address all previous comments I made.)
> 4 files changed, 208 insertions(+), 147 deletions(-)
> delete mode 100644 Silicon/Qemu/SbsaQemu/AcpiTables/Iort.aslc
>
> diff --git a/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf b/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf
> index 554c5e4b6f9e..97021f7971c7 100644
> --- a/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf
> +++ b/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf
> @@ -22,7 +22,6 @@ [Sources]
> Gtdt.aslc
> Mcfg.aslc
> Spcr.aslc
> - Iort.aslc
>
> [Packages]
> ArmPlatformPkg/ArmPlatformPkg.dec
> diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
> index 3ec7ffd8dd5c..14d760b36400 100644
> --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
> +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
> @@ -49,6 +49,7 @@ [Pcd]
> gArmTokenSpaceGuid.PcdGicDistributorBase
> gArmTokenSpaceGuid.PcdGicRedistributorsBase
> gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdGicItsBase
> + gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdSmmuBase
>
> [Depex]
> gEfiAcpiTableProtocolGuid ## CONSUMES
> diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
> index 961482269678..bd3ba75f52fa 100644
> --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
> +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
> @@ -8,6 +8,7 @@
> **/
> #include <IndustryStandard/Acpi.h>
> #include <IndustryStandard/AcpiAml.h>
> +#include <IndustryStandard/IoRemappingTable.h>
> #include <IndustryStandard/SbsaQemuAcpi.h>
> #include <Library/AcpiLib.h>
> #include <Library/BaseMemoryLib.h>
> @@ -21,6 +22,36 @@
> #include <Library/UefiLib.h>
> #include <Protocol/AcpiTable.h>
>
> +#pragma pack(1)
> +
> +typedef struct {
> + EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE Node;
> + UINT32 Identifiers;
> +} SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE;
> +
> +typedef struct
> +{
> + EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE SmmuNode;
> + EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE SmmuIdMap;
> +} SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE;
> +
> +typedef struct
> +{
> + EFI_ACPI_6_0_IO_REMAPPING_RC_NODE RcNode;
> + EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE RcIdMap;
> +} SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE;
> +
> +typedef struct {
> + EFI_ACPI_6_0_IO_REMAPPING_TABLE Iort;
> + SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE ItsNode;
> + SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE SmmuNode;
> + SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE RcNode;
> +} SBSA_IO_REMAPPING_STRUCTURE;
> +
> +static UINTN GicItsBase;
> +
> +#pragma pack ()
> +
> /*
> * A Function to Compute the ACPI Table Checksum
> */
> @@ -40,6 +71,159 @@ AcpiPlatformChecksum (
> Buffer[ChecksumOffset] = CalculateCheckSum8(Buffer, Size);
> }
>
> +/*
> + * A function that add the IORT ACPI table.
> + IN EFI_ACPI_COMMON_HEADER *CurrentTable
> + */
> +EFI_STATUS
> +AddIortTable (
> + IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable
> + )
> +{
> + EFI_STATUS Status;
> + UINTN TableHandle;
> + UINT32 TableSize;
> + EFI_PHYSICAL_ADDRESS PageAddress;
> + UINT8 *New;
> +
> + // Initialize IORT ACPI Header
> + EFI_ACPI_6_0_IO_REMAPPING_TABLE Header = {
> + SBSAQEMU_ACPI_HEADER(EFI_ACPI_6_0_IO_REMAPPING_TABLE_SIGNATURE,
> + SBSA_IO_REMAPPING_STRUCTURE,
> + EFI_ACPI_IO_REMAPPING_TABLE_REVISION_00),
> + 3,
> + sizeof(EFI_ACPI_6_0_IO_REMAPPING_TABLE), // NodeOffset
> + 0 };
> +
> + // Initialize SMMU3 Structure
> + SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE Smmu3 = {
> + {
> + {
> + EFI_ACPI_IORT_TYPE_SMMUv3,
> + sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE),
> + 2, // Revision
> + 0, // Reserved
> + 1, // NumIdMapping
> + OFFSET_OF (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE, SmmuIdMap) // IdReference
> + },
> + PcdGet64 (PcdSmmuBase), // Base address
> + EFI_ACPI_IORT_SMMUv3_FLAG_COHAC_OVERRIDE, // Flags
> + 0, // Reserved
> + 0, // VATOS address
> + EFI_ACPI_IORT_SMMUv3_MODEL_GENERIC, // SMMUv3 Model
> + 74, // Event
> + 75, // Pri
> + 77, // Gerror
> + 76, // Sync
> + 0, // Proximity domain
> + 1 // DevIDMappingIndex
> + },
> + {
> + 0x0000, // InputBase
> + 0xffff, // NumIds
> + 0x0000, // OutputBase
> + OFFSET_OF (SBSA_IO_REMAPPING_STRUCTURE, ItsNode), // OutputReference
> + 0 // Flags
> + }
> + };
> +
> +//NOTE(hrw): update to IORT E.e?
> + SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE Rc = {
> + {
> + {
> + EFI_ACPI_IORT_TYPE_ROOT_COMPLEX, // Type
> + sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE), // Length
> + 0, // Revision
> + 0, // Reserved
> + 1, // NumIdMappings
> + OFFSET_OF (SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE, RcIdMap) // IdReference
> + },
> + 1, // CacheCoherent
> + 0, // AllocationHints
> + 0, // Reserved
> + 0, // MemoryAccessFlags
> + EFI_ACPI_IORT_ROOT_COMPLEX_ATS_UNSUPPORTED, // AtsAttribute
> + 0x0, // PciSegmentNumber
> + //0, //MemoryAddressSizeLimit
> + },
> + {
> + 0x0000, // InputBase
> + 0xffff, // NumIds
> + 0x0000, // OutputBase
> + OFFSET_OF (SBSA_IO_REMAPPING_STRUCTURE, SmmuNode), // OutputReference
> + 0, // Flags
> + }
> + };
> +
> + SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE Its = {
> + // EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE
> + {
> + // EFI_ACPI_6_0_IO_REMAPPING_NODE
> + {
> + EFI_ACPI_IORT_TYPE_ITS_GROUP, // Type
> + sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE), // Length
> + 0, // Revision
> + 0, // Identifier
> + 0, // NumIdMappings
> + 0, // IdReference
> + },
> + 1, // ITS count
> + },
> + 0, // GIC ITS Identifiers
> + };
> +
> + // Calculate the new table size based on the number of cores
> + TableSize = sizeof (EFI_ACPI_6_0_IO_REMAPPING_TABLE) +
> + sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE) +
> + sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE) +
> + sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE);
> +
> + Status = gBS->AllocatePages (
> + AllocateAnyPages,
> + EfiACPIReclaimMemory,
> + EFI_SIZE_TO_PAGES (TableSize),
> + &PageAddress
> + );
> + if (EFI_ERROR(Status)) {
> + DEBUG ((DEBUG_ERROR, "Failed to allocate pages for IORT table\n"));
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + New = (UINT8 *)(UINTN) PageAddress;
> + ZeroMem (New, TableSize);
> +
> + // Add the ACPI Description table header
> + CopyMem (New, &Header, sizeof (EFI_ACPI_6_0_IO_REMAPPING_TABLE));
> + ((EFI_ACPI_DESCRIPTION_HEADER*) New)->Length = TableSize;
> + New += sizeof (EFI_ACPI_6_0_IO_REMAPPING_TABLE);
> +
> + // ITS Node
> + CopyMem (New, &Its, sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE));
> + New += sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE);
> +
> + // SMMUv3 Node
> + CopyMem (New, &Smmu3, sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE));
> + New += sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE);
> +
> + // RC Node
> + 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);
> +
> + Status = AcpiTable->InstallAcpiTable (
> + AcpiTable,
> + (EFI_ACPI_COMMON_HEADER *)PageAddress,
> + TableSize,
> + &TableHandle
> + );
> + if (EFI_ERROR(Status)) {
> + DEBUG ((DEBUG_ERROR, "Failed to install IORT table\n"));
> + }
> +
> + return Status;
> +}
> +
> /*
> * A function that add the MADT ACPI table.
> IN EFI_ACPI_COMMON_HEADER *CurrentTable
> @@ -91,11 +275,6 @@ AddMadtTable (
> // Initialize GIC Redistributor Structure
> EFI_ACPI_6_0_GICR_STRUCTURE Gicr = SBSAQEMU_MADT_GICR_INIT();
>
> - // Initialize GIC ITS Structure
> - EFI_ACPI_6_5_GIC_ITS_STRUCTURE Gic_Its = SBSAQEMU_MADT_GIC_ITS_INIT(0);
> -
> - DEBUG ((DEBUG_ERROR, "itsBaseAddr is 0x%4x\n", PcdGet64 (PcdGicItsBase)));
> -
> // Get CoreCount which was determined eariler after parsing device tree
> NumCores = PcdGet32 (PcdCoreCount);
>
> @@ -103,8 +282,14 @@ AddMadtTable (
> TableSize = sizeof (EFI_ACPI_6_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER) +
> (sizeof (EFI_ACPI_6_0_GIC_STRUCTURE) * NumCores) +
> sizeof (EFI_ACPI_6_0_GIC_DISTRIBUTOR_STRUCTURE) +
> - sizeof (EFI_ACPI_6_0_GICR_STRUCTURE) +
> - sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE);
> + sizeof (EFI_ACPI_6_0_GICR_STRUCTURE);
> +
> + // Initialize GIC ITS Structure
> + EFI_ACPI_6_5_GIC_ITS_STRUCTURE Gic_Its = SBSAQEMU_MADT_GIC_ITS_INIT(0);
> +
> + if (GicItsBase > 0) {
> + TableSize += sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE);
> + }
>
> Status = gBS->AllocatePages (
> AllocateAnyPages,
> @@ -144,9 +329,11 @@ AddMadtTable (
> CopyMem (New, &Gicr, sizeof (EFI_ACPI_6_0_GICR_STRUCTURE));
> New += sizeof (EFI_ACPI_6_0_GICR_STRUCTURE);
>
> - // GIC ITS Structure
> - CopyMem (New, &Gic_Its, sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE));
> - New += sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE);
> + if (GicItsBase > 0) {
> + // GIC ITS Structure
> + CopyMem (New, &Gic_Its, sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE));
> + New += sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE);
> + }
>
> AcpiPlatformChecksum ((UINT8*) PageAddress, TableSize);
>
> @@ -317,7 +504,7 @@ AddSsdtTable (
> }
>
> /*
> - * A function that adds the SSDT ACPI table.
This is a fix, but unrelated to patch context. Please put in separate
patch.
/
Leif
> + * A function that adds the PPTT ACPI table.
> */
> EFI_STATUS
> AddPpttTable (
> @@ -448,6 +635,15 @@ InitializeSbsaQemuAcpiDxe (
> return Status;
> }
>
> + GicItsBase = PcdGet64 (PcdGicItsBase);
> +
> + if (GicItsBase > 0) {
> + Status = AddIortTable (AcpiTable);
> + if (EFI_ERROR (Status)) {
> + DEBUG ((DEBUG_ERROR, "Failed to add IORT table\n"));
> + }
> + }
> +
> Status = AddMadtTable (AcpiTable);
> if (EFI_ERROR(Status)) {
> DEBUG ((DEBUG_ERROR, "Failed to add MADT table\n"));
> diff --git a/Silicon/Qemu/SbsaQemu/AcpiTables/Iort.aslc b/Silicon/Qemu/SbsaQemu/AcpiTables/Iort.aslc
> deleted file mode 100644
> index ec4ce504efd1..000000000000
> --- a/Silicon/Qemu/SbsaQemu/AcpiTables/Iort.aslc
> +++ /dev/null
> @@ -1,135 +0,0 @@
> -/** @file
> -
> - Copyright (c) 2023, Linaro Ltd. All rights reserved.<BR>
> -
> - SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#include <IndustryStandard/IoRemappingTable.h>
> -#include <IndustryStandard/Acpi.h>
> -#include <IndustryStandard/SbsaQemuAcpi.h>
> -
> -#pragma pack(1)
> -
> -typedef struct {
> - EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE Node;
> - UINT32 Identifiers;
> -} SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE;
> -
> -typedef struct
> -{
> - EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE SmmuNode;
> - EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE SmmuIdMap;
> -} SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE;
> -
> -typedef struct
> -{
> - EFI_ACPI_6_0_IO_REMAPPING_RC_NODE RcNode;
> - EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE RcIdMap;
> -} SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE;
> -
> -typedef struct {
> - EFI_ACPI_6_0_IO_REMAPPING_TABLE Iort;
> - SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE ItsNode;
> - SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE SmmuNode;
> - SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE RcNode;
> -} SBSA_IO_REMAPPING_STRUCTURE;
> -
> -#pragma pack ()
> -
> -STATIC SBSA_IO_REMAPPING_STRUCTURE Iort = {
> - {
> - SBSAQEMU_ACPI_HEADER(EFI_ACPI_6_0_IO_REMAPPING_TABLE_SIGNATURE,
> - SBSA_IO_REMAPPING_STRUCTURE,
> - EFI_ACPI_IO_REMAPPING_TABLE_REVISION_00),
> - 3, // NumNodes
> - sizeof(EFI_ACPI_6_0_IO_REMAPPING_TABLE), // NodeOffset
> - 0 // Reserved
> - },
> - // SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE
> - {
> - // EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE
> - {
> - // EFI_ACPI_6_0_IO_REMAPPING_NODE
> - {
> - EFI_ACPI_IORT_TYPE_ITS_GROUP, // Type
> - sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE), // Length
> - 0, // Revision
> - 0, // Reserved
> - 0, // NumIdMappings
> - 0, // IdReference
> - },
> - 1, // ITS count
> - },
> - 0, // GIC ITS Identifiers
> - },
> - // SMMU
> - {
> - // EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE
> - {
> - // EFI_ACPI_6_0_IO_REMAPPING_NODE
> - {
> - EFI_ACPI_IORT_TYPE_SMMUv3, // Type
> - sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE), // Length
> - 2, // Revision
> - 0, // Reserved
> - 1, // NumIdMapping
> - OFFSET_OF (SBSA_EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE, SmmuIdMap), // IdReference
> - },
> - 0x60050000, // Base address
> - EFI_ACPI_IORT_SMMUv3_FLAG_COHAC_OVERRIDE, // Flags
> - 0, // Reserved
> - 0, // VATOS address
> - EFI_ACPI_IORT_SMMUv3_MODEL_GENERIC, // SMMUv3 Model
> - 74, // Event
> - 75, // Pri
> - 77, // Gerror
> - 76, // Sync
> - 0, // Proximity domain
> - 1, // DevIDMappingIndex
> - },
> - // EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE
> - {
> - 0x0000, // InputBase
> - 0xffff, // NumIds
> - 0x0000, // OutputBase
> - OFFSET_OF (SBSA_IO_REMAPPING_STRUCTURE, ItsNode), // OutputReference
> - 0, // Flags
> - },
> - },
> - // SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE
> - {
> - // EFI_ACPI_6_0_IO_REMAPPING_RC_NODE
> - {
> - // EFI_ACPI_6_0_IO_REMAPPING_NODE
> - {
> - EFI_ACPI_IORT_TYPE_ROOT_COMPLEX, // Type
> - sizeof (SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE), // Length
> - 0, // Revision
> - 0, // Reserved
> - 1, // NumIdMappings
> - OFFSET_OF (SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE, RcIdMap) // IdReference
> - },
> - 1, // CacheCoherent
> - 0, // AllocationHints
> - 0, // Reserved
> - 0, // MemoryAccessFlags
> - EFI_ACPI_IORT_ROOT_COMPLEX_ATS_UNSUPPORTED, // AtsAttribute
> - 0x0, // PciSegmentNumber
> - //0, //MemoryAddressSizeLimit
> - },
> - // EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE
> - {
> - 0x0000, // InputBase
> - 0xffff, // NumIds
> - 0x0000, // OutputBase
> - OFFSET_OF (SBSA_IO_REMAPPING_STRUCTURE, SmmuNode), // OutputReference
> - 0, // Flags
> - }
> - }
> -};
> -
> -#pragma pack()
> -
> -VOID* CONST ReferenceAcpiTable = &Iort;
> \ No newline at end of file
> --
> 2.41.0
>
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#107933): https://edk2.groups.io/g/devel/message/107933
Mute This Topic: https://groups.io/mt/100874755/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/leave/3901457/1787277/102458076/xyzzy [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
W dniu 21.08.2023 o 20:27, Leif Lindholm pisze: > Hmm, wait. Patch 1/3 adds Iort.aslc and patch 3/3 deletes it. I know > 1/3 is Shashi's original implementation and 3/3 is heavily based on > that (if rewritten), but there's no point in merging the churn. I kind of wanted to get review of both parts. First one (written by Shashi long time ago) and rest (written by me in last months). Whole testing was "does Linux boots and shows me complex PCIe structure". Can squash into one, no problem. > What does this set look like as a single squashed patch? (I think > doing that would also address all previous comments I made.) 22:16 marcin@applejack:edk2-platforms$ git diff --stat origin/master Silicon/Qemu/SbsaQemu/SbsaQemu.dec | 4 + Platform/Qemu/SbsaQemu/SbsaQemu.dsc | 4 + Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf | 1 + Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf | 2 + Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuPlatformDxe/SbsaQemuPlatformDxe.inf | 1 + Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuAcpi.h | 11 ++ Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h | 1 + Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c | 208 +++++++++++++++++++- Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuPlatformDxe/SbsaQemuPlatformDxe.c | 10 + 9 files changed, 241 insertions(+), 1 deletion(-) -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#107936): https://edk2.groups.io/g/devel/message/107936 Mute This Topic: https://groups.io/mt/100874755/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
© 2016 - 2026 Red Hat, Inc.