From 04f1a7096adf2fc5fd6d70e37a9a4a8e47dfa4d1 Mon Sep 17 00:00:00 2001 From: Ronald Cron Date: Thu, 26 Feb 2015 10:54:39 +0000 Subject: ArmPlatformPkg/ArmVExpressDxe: Load FDT into the EFI Configuration Table Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ronald Cron Reviewed-by: Olivier Martin git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16937 6f19259b-4bc3-4df7-8a09-765794883524 --- EmbeddedPkg/EmbeddedPkg.dsc | 3 +- .../Library/FdtLoadLib/FdtConfigurationTable.c | 280 --------------------- EmbeddedPkg/Library/FdtLoadLib/FdtLoadLib.inf | 45 ---- 3 files changed, 1 insertion(+), 327 deletions(-) delete mode 100644 EmbeddedPkg/Library/FdtLoadLib/FdtConfigurationTable.c delete mode 100644 EmbeddedPkg/Library/FdtLoadLib/FdtLoadLib.inf (limited to 'EmbeddedPkg') diff --git a/EmbeddedPkg/EmbeddedPkg.dsc b/EmbeddedPkg/EmbeddedPkg.dsc index fc42fe5128..d3f8e7c507 100644 --- a/EmbeddedPkg/EmbeddedPkg.dsc +++ b/EmbeddedPkg/EmbeddedPkg.dsc @@ -3,7 +3,7 @@ # # # Copyright (c) 2007, Intel Corporation. All rights reserved.
-# Copyright (c) 2012-2014, ARM Ltd. All rights reserved.
+# Copyright (c) 2012-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 @@ -270,7 +270,6 @@ EmbeddedPkg/Universal/MmcDxe/MmcDxe.inf # FDT installation - EmbeddedPkg/Library/FdtLoadLib/FdtLoadLib.inf EmbeddedPkg/Drivers/FdtPlatformDxe/FdtPlatformDxe.inf EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.inf diff --git a/EmbeddedPkg/Library/FdtLoadLib/FdtConfigurationTable.c b/EmbeddedPkg/Library/FdtLoadLib/FdtConfigurationTable.c deleted file mode 100644 index a95e24958b..0000000000 --- a/EmbeddedPkg/Library/FdtLoadLib/FdtConfigurationTable.c +++ /dev/null @@ -1,280 +0,0 @@ -/** @file -* -* Copyright (c) 2014, ARM Limited. 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 -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include - -// -// Device path for SemiHosting -// -STATIC CONST struct { - VENDOR_DEVICE_PATH Guid; - EFI_DEVICE_PATH_PROTOCOL End; -} mSemihostingDevicePath = { - { - { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0 } }, - { 0xC5B9C74A, 0x6D72, 0x4719, { 0x99, 0xAB, 0xC5, 0x9F, 0x19, 0x90, 0x91, 0xEB } } - }, - { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 } } -}; - - -/** - This function declares the passed FDT into the UEFI Configuration Table - - @param FdtBlob Base address of the Fdt Blob in System Memory - @param FdtSize Size of the Fdt Blob in System Memory - - @return EFI_SUCCESS Fdt Blob was successfully installed into the configuration table - @return !EFI_SUCCESS Error returned by BS.InstallConfigurationTable() - -**/ -STATIC -EFI_STATUS -InstallFdtIntoConfigurationTable ( - IN VOID* FdtBlob, - IN UINTN FdtSize - ) -{ - EFI_STATUS Status; - - // Check the FDT header is valid. We only make this check in DEBUG mode in case the FDT header change on - // production device and this ASSERT() becomes not valid. - ASSERT (fdt_check_header (FdtBlob) == 0); - - // Ensure the Size of the Device Tree is smaller than the size of the read file - ASSERT ((UINTN)fdt_totalsize (FdtBlob) <= FdtSize); - - // Install the FDT into the Configuration Table - Status = gBS->InstallConfigurationTable (&gFdtTableGuid, FdtBlob); - - return Status; -} - - -/** - Load and Install FDT from Semihosting - - @param Filename Name of the file to load from semihosting - - @return EFI_SUCCESS Fdt Blob was successfully installed into the configuration table - from semihosting - @return EFI_NOT_FOUND Fail to locate the file in semihosting - @return EFI_OUT_OF_RESOURCES Fail to allocate memory to contain the blob -**/ -EFI_STATUS -InstallFdtFromSemihosting ( - IN CONST CHAR16* FileName - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH* Remaining; - EFI_HANDLE Handle; - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SemihostingFs; - EFI_FILE_PROTOCOL *Fs; - EFI_FILE_PROTOCOL *File; - EFI_PHYSICAL_ADDRESS FdtBase; - EFI_FILE_INFO *FileInfo; - UINTN FdtSize; - UINTN FileInfoSize; - - // Ensure the Semihosting driver is initialized - Remaining = (EFI_DEVICE_PATH*)&mSemihostingDevicePath; - // The LocateDevicePath() function locates all devices on DevicePath that support Protocol and returns - // the handle to the device that is closest to DevicePath. On output, the device path pointer is modified - // to point to the remaining part of the device path - Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &Remaining, &Handle); - if (EFI_ERROR (Status)) { - ASSERT_EFI_ERROR (Status); - return Status; - } - - // Recursive = FALSE: We do not want to start the whole device tree - Status = gBS->ConnectController (Handle, NULL, Remaining, FALSE); - if (EFI_ERROR (Status)) { - return Status; - } - - // Locate the FileSystem - Status = gBS->HandleProtocol (Handle, &gEfiSimpleFileSystemProtocolGuid, (VOID **)&SemihostingFs); - if (EFI_ERROR (Status)) { - ASSERT_EFI_ERROR (Status); - return Status; - } - - // Try to Open the volume and get root directory - Status = SemihostingFs->OpenVolume (SemihostingFs, &Fs); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_WARN, "Warning: Fail to open semihosting filesystem that should contain FDT file.\n")); - return Status; - } - - File = NULL; - Status = Fs->Open (Fs, &File, (CHAR16*)FileName, EFI_FILE_MODE_READ, 0); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_WARN, "Warning: Fail to load FDT file '%s'.\n", FileName)); - Fs->Close (Fs); - return Status; - } - - FileInfoSize = 0; - File->GetInfo (File, &gEfiFileInfoGuid, &FileInfoSize, NULL); - FileInfo = AllocatePool (FileInfoSize); - if (FileInfo == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto CLOSE_FILES; - } - Status = File->GetInfo (File, &gEfiFileInfoGuid, &FileInfoSize, FileInfo); - if (EFI_ERROR (Status)) { - FreePool (FileInfo); - goto CLOSE_FILES; - } - - // Get the file size - FdtSize = FileInfo->FileSize; - FreePool (FileInfo); - - // The FDT blob is attached to the Configuration Table. It is recommended to load it as Runtime Service Data - // to prevent the kernel to overwrite its data - Status = gBS->AllocatePages (AllocateAnyPages, EfiRuntimeServicesData, EFI_SIZE_TO_PAGES (FdtSize), &FdtBase); - if (!EFI_ERROR (Status)) { - Status = File->Read (File, &FdtSize, (VOID*)(UINTN)(FdtBase)); - if (EFI_ERROR (Status)) { - gBS->FreePages (FdtBase, EFI_SIZE_TO_PAGES (FdtSize)); - } else { - // Install the FDT as part of the UEFI Configuration Table - Status = InstallFdtIntoConfigurationTable ((VOID*)(UINTN)FdtBase, FdtSize); - if (EFI_ERROR (Status)) { - gBS->FreePages (FdtBase, EFI_SIZE_TO_PAGES (FdtSize)); - } - } - } - -CLOSE_FILES: - File->Close (File); - Fs->Close (Fs); - return Status; -} - -/** - Load and Install FDT from Firmware Volume - - @param Filename Guid of the FDT blob to load from firmware volume - - @return EFI_SUCCESS Fdt Blob was successfully installed into the configuration table - from firmware volume - @return EFI_NOT_FOUND Fail to locate the file in firmware volume - @return EFI_OUT_OF_RESOURCES Fail to allocate memory to contain the blob -**/ -EFI_STATUS -InstallFdtFromFv ( - IN CONST EFI_GUID *FileName - ) -{ - EFI_STATUS Status; - EFI_HANDLE *HandleBuffer; - UINTN NumberOfHandles; - UINT32 FvStatus; - UINTN Index; - EFI_FIRMWARE_VOLUME2_PROTOCOL *FvInstance; - INTN SectionInstance; - UINTN FdtSize; - VOID* FdtBlob; - EFI_PHYSICAL_ADDRESS FdtBase; - - FvStatus = 0; - SectionInstance = 0; - - // Locate all the Firmware Volume protocols. - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiFirmwareVolume2ProtocolGuid, - NULL, - &NumberOfHandles, - &HandleBuffer - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // Looking for FV that contains the FDT blob - for (Index = 0; Index < NumberOfHandles; Index++) { - // - // Get the protocol on this handle - // This should not fail because of LocateHandleBuffer - // - Status = gBS->HandleProtocol ( - HandleBuffer[Index], - &gEfiFirmwareVolume2ProtocolGuid, - (VOID**) &FvInstance - ); - if (EFI_ERROR (Status)) { - goto FREE_HANDLE_BUFFER; - } - - while (Status == EFI_SUCCESS) { - // FdtBlob must be allocated by ReadSection - FdtBlob = NULL; - - // See if it contains the FDT file - Status = FvInstance->ReadSection ( - FvInstance, - FileName, - EFI_SECTION_RAW, - SectionInstance, - &FdtBlob, - &FdtSize, - &FvStatus - ); - if (!EFI_ERROR (Status)) { - // When the FDT blob is attached to the Configuration Table it is recommended to load it as Runtime Service Data - // to prevent the kernel to overwrite its data - Status = gBS->AllocatePages (AllocateAnyPages, EfiRuntimeServicesData, EFI_SIZE_TO_PAGES (FdtSize), &FdtBase); - if (EFI_ERROR (Status)) { - goto FREE_HANDLE_BUFFER; - } - - // Copy the FDT to the Runtime memory - gBS->CopyMem ((VOID*)(UINTN)FdtBase, FdtBlob, FdtSize); - // Free the buffer allocated by FvInstance->ReadSection() - gBS->FreePool (FdtBlob); - - // Install the FDT as part of the UEFI Configuration Table - Status = InstallFdtIntoConfigurationTable ((VOID*)(UINTN)FdtBase, FdtSize); - if (EFI_ERROR (Status)) { - gBS->FreePages (FdtBase, EFI_SIZE_TO_PAGES (FdtSize)); - } - break; - } - } - } - -FREE_HANDLE_BUFFER: - // Free any allocated buffers - gBS->FreePool (HandleBuffer); - - return Status; -} diff --git a/EmbeddedPkg/Library/FdtLoadLib/FdtLoadLib.inf b/EmbeddedPkg/Library/FdtLoadLib/FdtLoadLib.inf deleted file mode 100644 index a50aa3607a..0000000000 --- a/EmbeddedPkg/Library/FdtLoadLib/FdtLoadLib.inf +++ /dev/null @@ -1,45 +0,0 @@ -#/* @file -# Copyright (c) 2014, Linaro Limited. 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. -# -#*/ - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = FdtLoadLib - FILE_GUID = F00298C1-BBC3-445F-8906-AAEAFE7729A4 - MODULE_TYPE = BASE - VERSION_STRING = 1.0 - LIBRARY_CLASS = FdtLoadLib - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = ARM AARCH64 -# - -[Sources] - FdtConfigurationTable.c - -[Packages] - MdePkg/MdePkg.dec - EmbeddedPkg/EmbeddedPkg.dec - -[LibraryClasses] - FdtLib - -[Protocols] - gEfiDevicePathProtocolGuid - gEfiSimpleFileSystemProtocolGuid - gEfiFirmwareVolume2ProtocolGuid - -[Guids] - gEfiFileInfoGuid - gFdtTableGuid -- cgit v1.2.3