ArmVirtPkg/HighMemDxe: move to FDT client protocol

Use the FDT client protocol rather than parsing the DT directly using
fdtlib. While we're at it, update the code so it deals correctly with
memory nodes that describe multiple disjoint regions in their "reg"
properties, and make the code work with #address-cells/#size-cells
properties of <1> as well as <2>.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
Ard Biesheuvel 2016-09-15 14:23:11 +01:00
parent 969d2eb387
commit 490acf8908
2 changed files with 62 additions and 76 deletions

View File

@ -1,7 +1,7 @@
/** @file /** @file
* High memory node enumeration DXE driver for ARM Virtual Machines * High memory node enumeration DXE driver for ARM Virtual Machines
* *
* Copyright (c) 2015, Linaro Ltd. All rights reserved. * Copyright (c) 2015-2016, Linaro Ltd. All rights reserved.
* *
* This program and the accompanying materials are licensed and made available * This program and the accompanying materials are licensed and made available
* under the terms and conditions of the BSD License which accompanies this * under the terms and conditions of the BSD License which accompanies this
@ -15,12 +15,12 @@
**/ **/
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
#include <libfdt.h>
#include <Library/DxeServicesTableLib.h> #include <Library/DxeServicesTableLib.h>
#include <Library/PcdLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Protocol/FdtClient.h>
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -29,76 +29,64 @@ InitializeHighMemDxe (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
VOID *Hob; FDT_CLIENT_PROTOCOL *FdtClient;
VOID *DeviceTreeBase; EFI_STATUS Status, FindNodeStatus;
INT32 Node, Prev; INT32 Node;
EFI_STATUS Status; CONST UINT32 *Reg;
CONST CHAR8 *Type; UINT32 RegSize;
INT32 Len; UINTN AddressCells, SizeCells;
CONST VOID *RegProp; UINT64 CurBase;
UINT64 CurBase; UINT64 CurSize;
UINT64 CurSize;
Hob = GetFirstGuidHob(&gFdtHobGuid); Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL,
if (Hob == NULL || GET_GUID_HOB_DATA_SIZE (Hob) != sizeof (UINT64)) { (VOID **)&FdtClient);
return EFI_NOT_FOUND; ASSERT_EFI_ERROR (Status);
}
DeviceTreeBase = (VOID *)(UINTN)*(UINT64 *)GET_GUID_HOB_DATA (Hob);
if (fdt_check_header (DeviceTreeBase) != 0) {
DEBUG ((EFI_D_ERROR, "%a: No DTB found @ 0x%p\n", __FUNCTION__,
DeviceTreeBase));
return EFI_NOT_FOUND;
}
DEBUG ((EFI_D_INFO, "%a: DTB @ 0x%p\n", __FUNCTION__, DeviceTreeBase));
// //
// Check for memory node and add the memory spaces expect the lowest one // Check for memory node and add the memory spaces except the lowest one
// //
for (Prev = 0;; Prev = Node) { for (FindNodeStatus = FdtClient->FindMemoryNodeReg (FdtClient, &Node,
Node = fdt_next_node (DeviceTreeBase, Prev, NULL); (CONST VOID **) &Reg, &AddressCells,
if (Node < 0) { &SizeCells, &RegSize);
break; !EFI_ERROR (FindNodeStatus);
} FindNodeStatus = FdtClient->FindNextMemoryNodeReg (FdtClient, Node,
&Node, (CONST VOID **) &Reg, &AddressCells,
&SizeCells, &RegSize)) {
ASSERT (AddressCells <= 2);
ASSERT (SizeCells <= 2);
Type = fdt_getprop (DeviceTreeBase, Node, "device_type", &Len); while (RegSize > 0) {
if (Type && AsciiStrnCmp (Type, "memory", Len) == 0) { CurBase = SwapBytes32 (*Reg++);
// if (AddressCells > 1) {
// Get the 'reg' property of this node. For now, we will assume CurBase = (CurBase << 32) | SwapBytes32 (*Reg++);
// two 8 byte quantities for base and size, respectively. }
// CurSize = SwapBytes32 (*Reg++);
RegProp = fdt_getprop (DeviceTreeBase, Node, "reg", &Len); if (SizeCells > 1) {
if (RegProp != NULL && Len == (2 * sizeof (UINT64))) { CurSize = (CurSize << 32) | SwapBytes32 (*Reg++);
}
RegSize -= (AddressCells + SizeCells) * sizeof (UINT32);
CurBase = fdt64_to_cpu (((UINT64 *)RegProp)[0]); if (PcdGet64 (PcdSystemMemoryBase) != CurBase) {
CurSize = fdt64_to_cpu (((UINT64 *)RegProp)[1]); Status = gDS->AddMemorySpace (EfiGcdMemoryTypeSystemMemory, CurBase,
CurSize, EFI_MEMORY_WB);
if (PcdGet64 (PcdSystemMemoryBase) != CurBase) { if (EFI_ERROR (Status)) {
Status = gDS->AddMemorySpace ( DEBUG ((EFI_D_ERROR,
EfiGcdMemoryTypeSystemMemory, "%a: Failed to add System RAM @ 0x%lx - 0x%lx (%r)\n",
CurBase, CurSize, __FUNCTION__, CurBase, CurBase + CurSize - 1, Status));
EFI_MEMORY_WB); continue;
}
if (EFI_ERROR (Status)) { Status = gDS->SetMemorySpaceAttributes (CurBase, CurSize,
DEBUG ((EFI_D_ERROR, EFI_MEMORY_WB);
"%a: Failed to add System RAM @ 0x%lx - 0x%lx (%r)\n",
__FUNCTION__, CurBase, CurBase + CurSize - 1, Status));
continue;
}
Status = gDS->SetMemorySpaceAttributes ( if (EFI_ERROR (Status)) {
CurBase, CurSize, DEBUG ((EFI_D_ERROR,
EFI_MEMORY_WB); "%a: Failed to set System RAM @ 0x%lx - 0x%lx attribute (%r)\n",
__FUNCTION__, CurBase, CurBase + CurSize - 1, Status));
if (EFI_ERROR (Status)) { } else {
DEBUG ((EFI_D_ERROR, DEBUG ((EFI_D_INFO, "%a: Add System RAM @ 0x%lx - 0x%lx\n",
"%a: Failed to set System RAM @ 0x%lx - 0x%lx attribute (%r)\n", __FUNCTION__, CurBase, CurBase + CurSize - 1));
__FUNCTION__, CurBase, CurBase + CurSize - 1, Status));
} else {
DEBUG ((EFI_D_INFO, "%a: Add System RAM @ 0x%lx - 0x%lx\n",
__FUNCTION__, CurBase, CurBase + CurSize - 1));
}
} }
} }
} }

View File

@ -1,7 +1,7 @@
## @file ## @file
# High memory node enumeration DXE driver for ARM Virtual Machines # High memory node enumeration DXE driver for ARM Virtual Machines
# #
# Copyright (c) 2015, Linaro Ltd. All rights reserved. # Copyright (c) 2015-2016, Linaro Ltd. All rights reserved.
# #
# This program and the accompanying materials are licensed and made available # This program and the accompanying materials are licensed and made available
# under the terms and conditions of the BSD License which accompanies this # under the terms and conditions of the BSD License which accompanies this
@ -30,23 +30,21 @@
MdePkg/MdePkg.dec MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec MdeModulePkg/MdeModulePkg.dec
ArmPkg/ArmPkg.dec ArmPkg/ArmPkg.dec
ArmPlatformPkg/ArmPlatformPkg.dec
ArmVirtPkg/ArmVirtPkg.dec ArmVirtPkg/ArmVirtPkg.dec
EmbeddedPkg/EmbeddedPkg.dec
[LibraryClasses] [LibraryClasses]
BaseLib BaseLib
PcdLib DebugLib
UefiDriverEntryPoint
FdtLib
HobLib
DxeServicesTableLib DxeServicesTableLib
PcdLib
UefiBootServicesTableLib
UefiDriverEntryPoint
[Guids] [Protocols]
gFdtHobGuid gFdtClientProtocolGuid ## CONSUMES
[Pcd] [Pcd]
gArmTokenSpaceGuid.PcdSystemMemoryBase gArmTokenSpaceGuid.PcdSystemMemoryBase
[Depex] [Depex]
gEfiCpuArchProtocolGuid gEfiCpuArchProtocolGuid AND gFdtClientProtocolGuid