/** @file | |
The library call to pass the device tree to DXE via HOB. | |
Copyright (c) 2021, Hewlett Packard Enterprise Development LP. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
// | |
//// The package level header files this module uses | |
//// | |
#include <PiPei.h> | |
#include <Library/DebugLib.h> | |
#include <Library/HobLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/BaseRiscVSbiLib.h> | |
#include <Library/PcdLib.h> | |
#include <Include/Library/PrePiLib.h> | |
#include <libfdt.h> | |
#include <Guid/FdtHob.h> | |
/** | |
@retval EFI_SUCCESS The address of FDT is passed in HOB. | |
EFI_UNSUPPORTED Can't locate FDT. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
PlatformPeimInitialization ( | |
VOID | |
) | |
{ | |
EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContext; | |
VOID *FdtPointer; | |
VOID *Base; | |
VOID *NewBase; | |
UINTN FdtSize; | |
UINTN FdtPages; | |
UINT64 *FdtHobData; | |
FirmwareContext = NULL; | |
GetFirmwareContextPointer (&FirmwareContext); | |
if (FirmwareContext == NULL) { | |
DEBUG ((DEBUG_ERROR, "%a: Firmware Context is NULL\n", __func__)); | |
return EFI_UNSUPPORTED; | |
} | |
FdtPointer = (VOID *)FirmwareContext->FlattenedDeviceTree; | |
if (FdtPointer == NULL) { | |
DEBUG ((DEBUG_ERROR, "%a: Invalid FDT pointer\n", __func__)); | |
return EFI_UNSUPPORTED; | |
} | |
DEBUG ((DEBUG_INFO, "%a: Build FDT HOB - FDT at address: 0x%x \n", __func__, FdtPointer)); | |
Base = FdtPointer; | |
if (fdt_check_header (Base) != 0) { | |
DEBUG ((DEBUG_ERROR, "%a: Corrupted DTB\n", __func__)); | |
return EFI_UNSUPPORTED; | |
} | |
FdtSize = fdt_totalsize (Base); | |
FdtPages = EFI_SIZE_TO_PAGES (FdtSize); | |
NewBase = AllocatePages (FdtPages); | |
if (NewBase == NULL) { | |
DEBUG ((DEBUG_ERROR, "%a: Could not allocate memory for DTB\n", __func__)); | |
return EFI_UNSUPPORTED; | |
} | |
fdt_open_into (Base, NewBase, EFI_PAGES_TO_SIZE (FdtPages)); | |
FdtHobData = BuildGuidHob (&gFdtHobGuid, sizeof *FdtHobData); | |
if (FdtHobData == NULL) { | |
DEBUG ((DEBUG_ERROR, "%a: Could not build FDT Hob\n", __func__)); | |
return EFI_UNSUPPORTED; | |
} | |
*FdtHobData = (UINTN)NewBase; | |
BuildFvHob (PcdGet32 (PcdOvmfDxeMemFvBase), PcdGet32 (PcdOvmfDxeMemFvSize)); | |
return EFI_SUCCESS; | |
} |