From e0ae276139a24baea95f6fc2f97892263d0e0443 Mon Sep 17 00:00:00 2001 From: Olivier Martin Date: Wed, 27 May 2015 15:06:11 +0000 Subject: ArmPlatformPkg/ArmJunoPkg: ACPI PCI Support Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Olivier Martin Reviewed-by: Ronald Cron git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17522 6f19259b-4bc3-4df7-8a09-765794883524 --- .../ArmJunoPkg/Drivers/ArmJunoDxe/AcpiTables.c | 78 ++++++++++++++++++++++ .../ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.c | 44 ++++++++++-- .../ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.inf | 8 +++ .../Drivers/ArmJunoDxe/ArmJunoDxeInternal.h | 12 ++++ 4 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/AcpiTables.c (limited to 'ArmPlatformPkg/ArmJunoPkg/Drivers') diff --git a/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/AcpiTables.c b/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/AcpiTables.c new file mode 100644 index 0000000000..bf08346434 --- /dev/null +++ b/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/AcpiTables.c @@ -0,0 +1,78 @@ +/** @file + + This file contains support for ACPI Tables that are generated at boot time. + + Copyright (c) 2015, ARM Ltd. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include "ArmPlatform.h" +#include "ArmJunoDxeInternal.h" + +#include + +/* + * Memory Mapped Configuration Space Access Table (MCFG) + */ +typedef struct { + EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER Header; + EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE Entry; +} MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ACCESS_TABLE; + +MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ACCESS_TABLE mAcpiMcfgTable = { + { + ARM_ACPI_HEADER ( + EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE, + MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ACCESS_TABLE, + EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_TABLE_REVISION + ), + 0, // Reserved + }, { + FixedPcdGet32 (PcdPciConfigurationSpaceBaseAddress), + 0, // PciSegmentGroupNumber + FixedPcdGet32 (PcdPciBusMin), + FixedPcdGet32 (PcdPciBusMax), + 0 // Reserved; + } +}; + +/** + * Callback called when ACPI Protocol is installed + */ +VOID +AcpiPciNotificationEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; + UINTN AcpiTableKey; + + // + // Ensure the ACPI protocol is installed + // + Status = gBS->LocateProtocol ( + &gEfiAcpiTableProtocolGuid, + NULL, + (VOID**)&AcpiTableProtocol + ); + if (EFI_ERROR (Status)) { + return; + } + + // + // Install MCFG Table + // + AcpiTableKey = 0; + Status = AcpiTableProtocol->InstallAcpiTable (AcpiTableProtocol, &mAcpiMcfgTable, sizeof (mAcpiMcfgTable), &AcpiTableKey); + ASSERT_EFI_ERROR (Status); +} diff --git a/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.c b/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.c index 386cf08e32..629d03a9ba 100644 --- a/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.c +++ b/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.c @@ -78,6 +78,8 @@ STATIC CONST EFI_PCI_ROOT_BRIDGE_DEVICE_PATH mPciRootComplexDevicePath = { } }; +EFI_EVENT mAcpiRegistration = NULL; + /** * Build and Set UEFI Variable Boot#### * @@ -187,6 +189,24 @@ OnEndOfDxe ( ASSERT_EFI_ERROR (Status); } +STATIC +BOOLEAN +AcpiTableJunoR0Check ( + IN EFI_ACPI_DESCRIPTION_HEADER *AcpiHeader + ) +{ + return TRUE; +} + +STATIC +BOOLEAN +AcpiTableJunoR1Check ( + IN EFI_ACPI_DESCRIPTION_HEADER *AcpiHeader + ) +{ + return TRUE; +} + EFI_STATUS EFIAPI ArmJunoEntryPoint ( @@ -297,9 +317,19 @@ ArmJunoEntryPoint ( } // - // Set the R1 two boot options if not already done. + // Try to install the ACPI Tables // + if (JunoRevision == JUNO_R0) { + Status = LocateAndInstallAcpiFromFvConditional (&mJunoAcpiTableFile, AcpiTableJunoR0Check); + } else if (JunoRevision == JUNO_R1) { + Status = LocateAndInstallAcpiFromFvConditional (&mJunoAcpiTableFile, AcpiTableJunoR1Check); + } + ASSERT_EFI_ERROR (Status); + + // + // Set the R1 two boot options if not already done. + // if (JunoRevision == JUNO_R1) { Status = SetJunoR1DefaultBootEntries (); if (EFI_ERROR (Status)) { @@ -308,6 +338,15 @@ ArmJunoEntryPoint ( // Enable PCI enumeration PcdSetBool (PcdPciDisableBusEnumeration, FALSE); + + // Declare the related ACPI Tables + EfiCreateProtocolNotifyEvent ( + &gEfiAcpiTableProtocolGuid, + TPL_CALLBACK, + AcpiPciNotificationEvent, + NULL, + &mAcpiRegistration + ); } // @@ -342,9 +381,6 @@ ArmJunoEntryPoint ( return Status; } - // Try to install the ACPI Tables - Status = LocateAndInstallAcpiFromFv (&mJunoAcpiTableFile); - return Status; } diff --git a/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.inf b/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.inf index 9013977c61..6157f9807f 100644 --- a/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.inf +++ b/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.inf @@ -19,6 +19,7 @@ ENTRY_POINT = ArmJunoEntryPoint [Sources.common] + AcpiTables.c ArmJunoDxe.c PciEmulation.c PciRootBridgeIo.c @@ -26,6 +27,7 @@ [Packages] ArmPkg/ArmPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec + ArmPlatformPkg/ArmVExpressPkg/ArmVExpressPkg.dec ArmPlatformPkg/ArmJunoPkg/ArmJuno.dec EmbeddedPkg/EmbeddedPkg.dec MdePkg/MdePkg.dec @@ -60,6 +62,7 @@ gEfiPciIoProtocolGuid gEfiPciRootBridgeIoProtocolGuid gEfiSimpleFileSystemProtocolGuid + gEfiAcpiTableProtocolGuid [FixedPcd] gArmTokenSpaceGuid.PcdSystemMemoryBase @@ -78,6 +81,11 @@ gArmPlatformTokenSpaceGuid.PcdDefaultBootDevicePath gArmPlatformTokenSpaceGuid.PcdDefaultBootArgument + # PCI Root complex specific PCDs + gArmJunoTokenSpaceGuid.PcdPciConfigurationSpaceBaseAddress + gArmPlatformTokenSpaceGuid.PcdPciBusMin + gArmPlatformTokenSpaceGuid.PcdPciBusMax + [Pcd] gEmbeddedTokenSpaceGuid.PcdFdtDevicePaths gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration diff --git a/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxeInternal.h b/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxeInternal.h index c7b1865877..662c41377f 100644 --- a/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxeInternal.h +++ b/ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxeInternal.h @@ -23,6 +23,9 @@ #include #include #include +#include + +#include #include @@ -31,4 +34,13 @@ PciEmulationEntryPoint ( VOID ); +/** + * Callback called when ACPI Protocol is installed + */ +VOID +AcpiPciNotificationEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ); + #endif // __ARM_JUNO_DXE_INTERNAL_H__ -- cgit v1.2.3