mirror of
https://github.com/edk2-porting/edk2-msm
synced 2025-05-13 05:42:53 +00:00
192 lines
4.3 KiB
C
Executable File
192 lines
4.3 KiB
C
Executable File
/** @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;
|
|
}
|