0
0
mirror of https://github.com/edk2-porting/edk2-msm synced 2025-05-13 09:12:53 +00:00
Files
2023-08-20 14:51:21 +08:00

189 lines
4.3 KiB
C

/** @file
Copyright (c) 2011-2014, ARM Limited. All rights reserved.
Copyright (c) 2014, Linaro Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <PiPei.h>
#include <Library/DebugLib.h>
#include <Library/HobLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include "PlatformPeiLibInternal.h"
STATIC
EFI_STATUS
CfgGetMemInfoByName(
CHAR8 *RegionName, ARM_MEMORY_REGION_DESCRIPTOR_EX *MemRegions)
{
return LocateMemoryMapAreaByName(RegionName, MemRegions);
}
STATIC
EFI_STATUS
CfgGetMemInfoByAddress(
UINT64 RegionBaseAddress, ARM_MEMORY_REGION_DESCRIPTOR_EX *MemRegions)
{
return LocateMemoryMapAreaByAddress(RegionBaseAddress, MemRegions);
}
STATIC
EFI_STATUS
CfgGetCfgInfoString(CHAR8 *Key, CHAR8 *Value, UINTN *ValBuffSize)
{
if (AsciiStriCmp(Key, "OsTypeString") == 0) {
AsciiStrCpyS(Value, *ValBuffSize, "LA");
return EFI_SUCCESS;
}
return EFI_NOT_FOUND;
}
STATIC
EFI_STATUS
CfgGetCfgInfoVal(CHAR8 *Key, UINT32 *Value)
{
PCONFIGURATION_DESCRIPTOR_EX ConfigurationDescriptorEx =
gDeviceConfigurationDescriptorEx;
// Run through each configuration descriptor
while (ConfigurationDescriptorEx->Value != 0xFFFFFFFF) {
if (AsciiStriCmp(Key, ConfigurationDescriptorEx->Name) == 0) {
*Value = (UINT32)(ConfigurationDescriptorEx->Value & 0xFFFFFFFF);
return EFI_SUCCESS;
}
ConfigurationDescriptorEx++;
}
return EFI_NOT_FOUND;
}
STATIC
EFI_STATUS
CfgGetCfgInfoVal64(CHAR8 *Key, UINT64 *Value)
{
PCONFIGURATION_DESCRIPTOR_EX ConfigurationDescriptorEx =
gDeviceConfigurationDescriptorEx;
// Run through each configuration descriptor
while (ConfigurationDescriptorEx->Value != 0xFFFFFFFF) {
if (AsciiStriCmp(Key, ConfigurationDescriptorEx->Name) == 0) {
*Value = ConfigurationDescriptorEx->Value;
return EFI_SUCCESS;
}
ConfigurationDescriptorEx++;
}
return EFI_NOT_FOUND;
}
STATIC
UINTN
SFlush(VOID) { return EFI_SUCCESS; }
STATIC
UINTN
SControl(IN UINTN Arg, IN UINTN Param) { return EFI_SUCCESS; }
STATIC
BOOLEAN
SPoll(VOID) { return TRUE; }
STATIC
UINTN
SDrain(VOID) { return EFI_SUCCESS; }
STATIC
EFI_STATUS
ShInstallLib(IN CHAR8 *LibName, IN UINT32 LibVersion, IN VOID *LibIntf)
{
return EFI_SUCCESS;
}
UefiCfgLibType ConfigLib = {0x00010002, CfgGetMemInfoByName,
CfgGetCfgInfoString, CfgGetCfgInfoVal,
CfgGetCfgInfoVal64, CfgGetMemInfoByAddress};
SioPortLibType SioLib = {
0x00010001, SerialPortRead, SerialPortWrite, SPoll,
SDrain, SFlush, SControl, SerialPortSetAttributes,
};
STATIC
EFI_STATUS
ShLoadLib(CHAR8 *LibName, UINT32 LibVersion, VOID **LibIntf)
{
if (LibIntf == NULL)
return EFI_NOT_FOUND;
if (AsciiStriCmp(LibName, "UEFI Config Lib") == 0) {
*LibIntf = &ConfigLib;
return EFI_SUCCESS;
}
if (AsciiStriCmp(LibName, "SerialPort Lib") == 0) {
*LibIntf = &SioLib;
return EFI_SUCCESS;
}
return EFI_NOT_FOUND;
}
ShLibLoaderType ShLib = {0x00010001, ShInstallLib, ShLoadLib};
STATIC
VOID BuildMemHobForFv(IN UINT16 Type)
{
EFI_PEI_HOB_POINTERS HobPtr;
EFI_HOB_FIRMWARE_VOLUME2 *Hob = NULL;
HobPtr.Raw = GetHobList();
while ((HobPtr.Raw = GetNextHob(Type, HobPtr.Raw)) != NULL) {
if (Type == EFI_HOB_TYPE_FV2) {
Hob = HobPtr.FirmwareVolume2;
/* Build memory allocation HOB to mark it as BootServicesData */
BuildMemoryAllocationHob(
Hob->BaseAddress, EFI_SIZE_TO_PAGES(Hob->Length) * EFI_PAGE_SIZE,
EfiBootServicesData);
}
HobPtr.Raw = GET_NEXT_HOB(HobPtr);
}
}
STATIC GUID gEfiShLibHobGuid = EFI_SHIM_LIBRARY_GUID;
STATIC GUID gEfiInfoBlkHobGuid = EFI_INFORMATION_BLOCK_GUID;
STATIC GUID gFvDecompressHobGuid = EFI_FV_DECOMPRESS_GUID;
VOID InstallPlatformHob()
{
static int initialized = 0;
if (!initialized) {
UINTN Data = (UINTN)&ShLib;
UINTN Data2 = 0x9FFFF000;
UINTN Data3 = 0x9FC403D0;
BuildMemHobForFv(EFI_HOB_TYPE_FV2);
BuildGuidDataHob(&gEfiShLibHobGuid, &Data, sizeof(Data));
BuildGuidDataHob(&gEfiInfoBlkHobGuid, &Data2, sizeof(Data2));
BuildGuidDataHob(&gFvDecompressHobGuid, &Data3, sizeof(Data3));
initialized = 1;
}
}
EFI_STATUS
EFIAPI
PlatformPeim(
VOID
)
{
BuildFvHob(PcdGet64(PcdFvBaseAddress), PcdGet32(PcdFvSize));
InstallPlatformHob();
return EFI_SUCCESS;
}