[edk2] [PATCH v2 06/13] Platforms/FVP: add DtPlatformDtbLoaderLib implementation

Ard Biesheuvel posted 13 patches 7 years, 7 months ago
Only 10 patches received!
[edk2] [PATCH v2 06/13] Platforms/FVP: add DtPlatformDtbLoaderLib implementation
Posted by Ard Biesheuvel 7 years, 7 months ago
In preparation of switching to DtPlatformDxe to supply the device
tree image to the OS, add an implementation of DtPlatformDtbLoaderLib
that loads the correct version from an FV.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 Platforms/ARM/VExpress/Library/ArmVExpressDtPlatformDtbLoaderLib/ArmVExpressDtPlatformDtbLoaderLib.c   | 134 ++++++++++++++++++++
 Platforms/ARM/VExpress/Library/ArmVExpressDtPlatformDtbLoaderLib/ArmVExpressDtPlatformDtbLoaderLib.inf |  39 ++++++
 2 files changed, 173 insertions(+)

diff --git a/Platforms/ARM/VExpress/Library/ArmVExpressDtPlatformDtbLoaderLib/ArmVExpressDtPlatformDtbLoaderLib.c b/Platforms/ARM/VExpress/Library/ArmVExpressDtPlatformDtbLoaderLib/ArmVExpressDtPlatformDtbLoaderLib.c
new file mode 100644
index 000000000000..3a5613c83709
--- /dev/null
+++ b/Platforms/ARM/VExpress/Library/ArmVExpressDtPlatformDtbLoaderLib/ArmVExpressDtPlatformDtbLoaderLib.c
@@ -0,0 +1,134 @@
+/** @file
+*
+*  Copyright (c) 2017, Linaro, 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 <PiDxe.h>
+
+#include <Library/ArmGicLib.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/DxeServicesLib.h>
+#include <Library/IoLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+#include "ArmPlatform.h"
+
+typedef enum {
+  ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2,
+  ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2_LEGACY,
+  ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV3,
+  ARM_FVP_FOUNDATION_GICV2,
+  ARM_FVP_FOUNDATION_GICV2_LEGACY,
+  ARM_FVP_FOUNDATION_GICV3,
+  ARM_FVP_UNKNOWN,
+} ARM_VEXPRESS_PLATFORM_ID;
+
+ARM_VEXPRESS_PLATFORM_ID
+GetPlatformId (
+  VOID
+  )
+{
+  UINT32                SysId;
+  UINT32                FvpSysId;
+  UINT32                VariantSysId;
+  ARM_GIC_ARCH_REVISION GicRevision;
+
+  SysId = MmioRead32 (ARM_VE_SYS_ID_REG);
+
+  // Remove the GIC variant to identify if we are running on the FVP Base or
+  // Foundation models
+  FvpSysId     = SysId & (ARM_FVP_SYS_ID_HBI_MASK | ARM_FVP_SYS_ID_PLAT_MASK );
+  // Extract the variant from the SysId
+  VariantSysId = SysId & ARM_FVP_SYS_ID_VARIANT_MASK;
+
+  if (FvpSysId == ARM_FVP_BASE_BOARD_SYS_ID) {
+    if (VariantSysId == ARM_FVP_GIC_VE_MMAP) {
+      // FVP Base Model with legacy GIC memory map -- no longer supported
+      return ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2_LEGACY;
+    } else {
+      GicRevision = ArmGicGetSupportedArchRevision ();
+
+      if (GicRevision == ARM_GIC_ARCH_REVISION_2) {
+        // FVP Base Model with GICv2 support
+        return ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2;
+      } else {
+        // FVP Base Model with GICv3 support
+        return ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV3;
+      }
+    }
+  } else if (FvpSysId == ARM_FVP_FOUNDATION_BOARD_SYS_ID) {
+    if (VariantSysId == ARM_FVP_GIC_VE_MMAP) {
+      // FVP Foundation Model with legacy GIC memory map -- no longer supported
+      return ARM_FVP_FOUNDATION_GICV2_LEGACY;
+    } else {
+      GicRevision = ArmGicGetSupportedArchRevision ();
+
+      if (GicRevision == ARM_GIC_ARCH_REVISION_2) {
+        // FVP Foundation Model with GICv2
+        return ARM_FVP_FOUNDATION_GICV2;
+      } else {
+        // FVP Foundation Model with GICv3
+        return ARM_FVP_FOUNDATION_GICV3;
+      }
+    }
+  }
+  return ARM_FVP_UNKNOWN;
+}
+
+/**
+  Return a pool allocated copy of the DTB image that is appropriate for
+  booting the current platform via DT.
+
+  @param[out]   Dtb                   Pointer to the DTB copy
+  @param[out]   DtbSize               Size of the DTB copy
+
+  @retval       EFI_SUCCESS           Operation completed successfully
+  @retval       EFI_NOT_FOUND         No suitable DTB image could be located
+  @retval       EFI_OUT_OF_RESOURCES  No pool memory available
+
+**/
+EFI_STATUS
+EFIAPI
+DtPlatformLoadDtb (
+  OUT   VOID        **Dtb,
+  OUT   UINTN       *DtbSize
+  )
+{
+  EFI_STATUS                Status;
+  VOID                      *OrigDtb;
+  VOID                      *CopyDtb;
+  UINTN                     OrigDtbSize;
+  ARM_VEXPRESS_PLATFORM_ID  PlatformId;
+
+  PlatformId = GetPlatformId ();
+  ASSERT (PlatformId < ARM_FVP_UNKNOWN);
+  if (PlatformId >= ARM_FVP_UNKNOWN) {
+    return EFI_NOT_FOUND;
+  }
+
+  Status = GetSectionFromAnyFv (&gDtPlatformDefaultDtbFileGuid,
+             EFI_SECTION_RAW, (UINTN)PlatformId, &OrigDtb, &OrigDtbSize);
+  if (EFI_ERROR (Status)) {
+    return EFI_NOT_FOUND;
+  }
+
+  CopyDtb = AllocateCopyPool (OrigDtbSize, OrigDtb);
+  if (CopyDtb == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  *Dtb = CopyDtb;
+  *DtbSize = OrigDtbSize;
+
+  return EFI_SUCCESS;
+}
diff --git a/Platforms/ARM/VExpress/Library/ArmVExpressDtPlatformDtbLoaderLib/ArmVExpressDtPlatformDtbLoaderLib.inf b/Platforms/ARM/VExpress/Library/ArmVExpressDtPlatformDtbLoaderLib/ArmVExpressDtPlatformDtbLoaderLib.inf
new file mode 100644
index 000000000000..5012101fe8db
--- /dev/null
+++ b/Platforms/ARM/VExpress/Library/ArmVExpressDtPlatformDtbLoaderLib/ArmVExpressDtPlatformDtbLoaderLib.inf
@@ -0,0 +1,39 @@
+/** @file
+*
+*  Copyright (c) 2017, Linaro, 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.
+*
+**/
+
+[Defines]
+  INF_VERSION                    = 0x00010019
+  BASE_NAME                      = ArmVExpressDtPlatformDtbLoaderLib
+  FILE_GUID                      = 050d6041-1508-4ae7-a69f-250155ccb567
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = DtPlatformDtbLoaderLib|DXE_DRIVER
+
+[Sources]
+  ArmVExpressDtPlatformDtbLoaderLib.c
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  MdePkg/MdePkg.dec
+  EmbeddedPkg/EmbeddedPkg.dec
+
+[LibraryClasses]
+  ArmGicLib
+  BaseLib
+  DxeServicesLib
+  IoLib
+  MemoryAllocationLib
+
+[Guids]
+  gDtPlatformDefaultDtbFileGuid
-- 
2.9.3

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel