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:
Ard Biesheuvel
2017-03-29 13:58:42 +01:00
parent 7004b3e4a8
commit 971a2d520e
6 changed files with 7 additions and 445 deletions

View File

@@ -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)) {