mirror of https://github.com/acidanthera/audk.git
117 lines
3.4 KiB
C
117 lines
3.4 KiB
C
/** @file
|
|
|
|
Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#include <PiPei.h>
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/MemoryAllocationLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/PcdLib.h>
|
|
#include <Library/HobLib.h>
|
|
#include <Library/PeiServicesLib.h>
|
|
#include <Library/FspCommonLib.h>
|
|
#include <FspGlobalData.h>
|
|
#include <FspEas.h>
|
|
|
|
/**
|
|
Get system memory resource descriptor by owner.
|
|
|
|
@param[in] OwnerGuid resource owner guid
|
|
**/
|
|
EFI_HOB_RESOURCE_DESCRIPTOR *
|
|
EFIAPI
|
|
FspGetResourceDescriptorByOwner (
|
|
IN EFI_GUID *OwnerGuid
|
|
)
|
|
{
|
|
EFI_PEI_HOB_POINTERS Hob;
|
|
|
|
//
|
|
// Get the HOB list for processing
|
|
//
|
|
Hob.Raw = GetHobList ();
|
|
|
|
//
|
|
// Collect memory ranges
|
|
//
|
|
while (!END_OF_HOB_LIST (Hob)) {
|
|
if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
|
|
if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED) && \
|
|
(CompareGuid (&Hob.ResourceDescriptor->Owner, OwnerGuid))) {
|
|
return Hob.ResourceDescriptor;
|
|
}
|
|
}
|
|
Hob.Raw = GET_NEXT_HOB (Hob);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/**
|
|
Get system memory from HOB.
|
|
|
|
@param[in,out] LowMemoryLength less than 4G memory length
|
|
@param[in,out] HighMemoryLength greater than 4G memory length
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
FspGetSystemMemorySize (
|
|
IN OUT UINT64 *LowMemoryLength,
|
|
IN OUT UINT64 *HighMemoryLength
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
EFI_BOOT_MODE BootMode;
|
|
EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute;
|
|
EFI_PEI_HOB_POINTERS Hob;
|
|
|
|
ResourceAttribute = (
|
|
EFI_RESOURCE_ATTRIBUTE_PRESENT |
|
|
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
|
|
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
|
|
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
|
|
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
|
|
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
|
|
);
|
|
|
|
Status = PeiServicesGetBootMode (&BootMode);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
if (BootMode != BOOT_ON_S3_RESUME) {
|
|
ResourceAttribute |= EFI_RESOURCE_ATTRIBUTE_TESTED;
|
|
}
|
|
|
|
*HighMemoryLength = 0;
|
|
*LowMemoryLength = SIZE_1MB;
|
|
//
|
|
// Get the HOB list for processing
|
|
//
|
|
Hob.Raw = GetHobList ();
|
|
|
|
//
|
|
// Collect memory ranges
|
|
//
|
|
while (!END_OF_HOB_LIST (Hob)) {
|
|
if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
|
|
if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) ||
|
|
((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED) &&
|
|
(Hob.ResourceDescriptor->ResourceAttribute == ResourceAttribute))) {
|
|
//
|
|
// Need memory above 1MB to be collected here
|
|
//
|
|
if (Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB &&
|
|
Hob.ResourceDescriptor->PhysicalStart < (EFI_PHYSICAL_ADDRESS) BASE_4GB) {
|
|
*LowMemoryLength += (UINT64) (Hob.ResourceDescriptor->ResourceLength);
|
|
} else if (Hob.ResourceDescriptor->PhysicalStart >= (EFI_PHYSICAL_ADDRESS) BASE_4GB) {
|
|
*HighMemoryLength += (UINT64) (Hob.ResourceDescriptor->ResourceLength);
|
|
}
|
|
}
|
|
}
|
|
Hob.Raw = GET_NEXT_HOB (Hob);
|
|
}
|
|
}
|