ArmPlatformPkg/ArmVExpressDxe: remove FDT handling from ArmFvpDxe
Replace the elaborate but awkward handling of FDT images using device paths and string PCDs initialized to 128 spaces with a simple scheme involving a set of builtin DTBs and a bit of runtime logic to select between them. This is sufficient for ordinary use, which makes it more suitable as reference code. Note that overriding the DTB presented to the OS can easily be done with a UEFI application that simply installs a new DTB image under the existing FDT configuration table GUID. For this module, this simply involves removing all code that is involved in deciding which platform we are running on, and for reasoning about FDT device paths. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org> Tested-by: Ryan Harkin <ryan.harkin@linaro.org>
This commit is contained in:
@@ -12,16 +12,15 @@
|
||||
|
||||
**/
|
||||
|
||||
#include "ArmVExpressInternal.h"
|
||||
|
||||
#include <PiDxe.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/VirtioMmioDeviceLib.h>
|
||||
#include <Library/ArmShellCmdLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/DevicePathLib.h>
|
||||
|
||||
#include <Protocol/FirmwareVolume2.h>
|
||||
#include <Library/ArmShellCmdLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/VirtioMmioDeviceLib.h>
|
||||
|
||||
#include <VExpressMotherBoard.h>
|
||||
|
||||
#define ARM_FVP_BASE_VIRTIO_BLOCK_BASE 0x1c130000
|
||||
|
||||
@@ -55,95 +54,6 @@ VIRTIO_BLK_DEVICE_PATH mVirtioBlockDevicePath =
|
||||
}
|
||||
};
|
||||
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
InternalFindFdtByGuid (
|
||||
IN OUT EFI_DEVICE_PATH **FdtDevicePath,
|
||||
IN CONST EFI_GUID *FdtGuid
|
||||
)
|
||||
{
|
||||
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileDevicePath;
|
||||
EFI_HANDLE *HandleBuffer;
|
||||
UINTN HandleCount;
|
||||
UINTN Index;
|
||||
EFI_FIRMWARE_VOLUME2_PROTOCOL *FvProtocol;
|
||||
EFI_GUID NameGuid;
|
||||
UINTN Size;
|
||||
VOID *Key;
|
||||
EFI_FV_FILETYPE FileType;
|
||||
EFI_FV_FILE_ATTRIBUTES Attributes;
|
||||
EFI_DEVICE_PATH *FvDevicePath;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (FdtGuid == NULL) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
EfiInitializeFwVolDevicepathNode (&FileDevicePath, FdtGuid);
|
||||
|
||||
HandleBuffer = NULL;
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiFirmwareVolume2ProtocolGuid,
|
||||
NULL,
|
||||
&HandleCount,
|
||||
&HandleBuffer
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < HandleCount; Index++) {
|
||||
Status = gBS->HandleProtocol (
|
||||
HandleBuffer[Index],
|
||||
&gEfiFirmwareVolume2ProtocolGuid,
|
||||
(VOID **) &FvProtocol
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Allocate Key
|
||||
Key = AllocatePool (FvProtocol->KeySize);
|
||||
ASSERT (Key != NULL);
|
||||
ZeroMem (Key, FvProtocol->KeySize);
|
||||
|
||||
do {
|
||||
FileType = EFI_FV_FILETYPE_RAW;
|
||||
Status = FvProtocol->GetNextFile (FvProtocol, Key, &FileType, &NameGuid, &Attributes, &Size);
|
||||
if (Status == EFI_NOT_FOUND) {
|
||||
break;
|
||||
}
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Check whether this file is the one we are looking for. If so,
|
||||
// create a device path for it and return it to the caller.
|
||||
//
|
||||
if (CompareGuid (&NameGuid, FdtGuid)) {
|
||||
Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID **)&FvDevicePath);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
*FdtDevicePath = AppendDevicePathNode (FvDevicePath,
|
||||
(EFI_DEVICE_PATH_PROTOCOL *)&FileDevicePath);
|
||||
}
|
||||
goto Done;
|
||||
}
|
||||
} while (TRUE);
|
||||
FreePool (Key);
|
||||
}
|
||||
|
||||
if (Index == HandleCount) {
|
||||
Status = EFI_NOT_FOUND;
|
||||
}
|
||||
return Status;
|
||||
|
||||
Done:
|
||||
FreePool (Key);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generic UEFI Entrypoint for 'ArmFvpDxe' driver
|
||||
* See UEFI specification for the details of the parameters
|
||||
@@ -155,12 +65,7 @@ ArmFvpInitialise (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
CONST ARM_VEXPRESS_PLATFORM* Platform;
|
||||
EFI_STATUS Status;
|
||||
CHAR16 *TextDevicePath;
|
||||
UINTN TextDevicePathSize;
|
||||
VOID *Buffer;
|
||||
EFI_DEVICE_PATH *FdtDevicePath;
|
||||
|
||||
Status = gBS->InstallProtocolInterface (&ImageHandle,
|
||||
&gEfiDevicePathProtocolGuid, EFI_NATIVE_INTERFACE,
|
||||
@@ -169,38 +74,6 @@ ArmFvpInitialise (
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = ArmVExpressGetPlatform (&Platform);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
FdtDevicePath = NULL;
|
||||
Status = InternalFindFdtByGuid (&FdtDevicePath, Platform->FdtGuid);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
TextDevicePath = ConvertDevicePathToText (FdtDevicePath, FALSE, FALSE);
|
||||
if (TextDevicePath != NULL) {
|
||||
TextDevicePathSize = StrSize (TextDevicePath);
|
||||
}
|
||||
FreePool (FdtDevicePath);
|
||||
} else {
|
||||
TextDevicePathSize = StrSize ((CHAR16*)PcdGetPtr (PcdFvpFdtDevicePathsBase)) - sizeof (CHAR16);
|
||||
TextDevicePathSize += StrSize (Platform->FdtName);
|
||||
|
||||
TextDevicePath = AllocatePool (TextDevicePathSize);
|
||||
if (TextDevicePath != NULL) {
|
||||
StrCpy (TextDevicePath, ((CHAR16*)PcdGetPtr (PcdFvpFdtDevicePathsBase)));
|
||||
StrCat (TextDevicePath, Platform->FdtName);
|
||||
}
|
||||
}
|
||||
if (TextDevicePath != NULL) {
|
||||
Buffer = PcdSetPtr (PcdFdtDevicePaths, &TextDevicePathSize, TextDevicePath);
|
||||
if (Buffer == NULL) {
|
||||
DEBUG ((
|
||||
EFI_D_ERROR,
|
||||
"ArmFvpDxe: Setting of FDT device path in PcdFdtDevicePaths failed - %r\n", EFI_BUFFER_TOO_SMALL
|
||||
));
|
||||
}
|
||||
FreePool (TextDevicePath);
|
||||
}
|
||||
}
|
||||
|
||||
// Declare the Virtio BlockIo device
|
||||
Status = VirtioMmioInstallDevice (ARM_FVP_BASE_VIRTIO_BLOCK_BASE, ImageHandle);
|
||||
if (EFI_ERROR (Status)) {
|
||||
|
Reference in New Issue
Block a user