3 Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
4 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include <Library/BaseLib.h>
10 #include <Library/BaseMemoryLib.h>
11 #include <Library/MemoryAllocationLib.h>
12 #include <Library/DebugLib.h>
13 #include <Library/PcdLib.h>
14 #include <Library/HobLib.h>
15 #include <Library/PeiServicesLib.h>
16 #include <Library/FspCommonLib.h>
17 #include <FspGlobalData.h>
21 Get system memory resource descriptor by owner.
23 @param[in] OwnerGuid resource owner guid
25 EFI_HOB_RESOURCE_DESCRIPTOR
*
27 FspGetResourceDescriptorByOwner (
28 IN EFI_GUID
*OwnerGuid
31 EFI_PEI_HOB_POINTERS Hob
;
34 // Get the HOB list for processing
36 Hob
.Raw
= GetHobList ();
39 // Collect memory ranges
41 while (!END_OF_HOB_LIST (Hob
)) {
42 if (Hob
.Header
->HobType
== EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
) {
43 if ((Hob
.ResourceDescriptor
->ResourceType
== EFI_RESOURCE_MEMORY_RESERVED
) && \
44 (CompareGuid (&Hob
.ResourceDescriptor
->Owner
, OwnerGuid
)))
46 return Hob
.ResourceDescriptor
;
50 Hob
.Raw
= GET_NEXT_HOB (Hob
);
57 Get system memory from HOB.
59 @param[in,out] LowMemoryLength less than 4G memory length
60 @param[in,out] HighMemoryLength greater than 4G memory length
64 FspGetSystemMemorySize (
65 IN OUT UINT64
*LowMemoryLength
,
66 IN OUT UINT64
*HighMemoryLength
70 EFI_BOOT_MODE BootMode
;
71 EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute
;
72 EFI_PEI_HOB_POINTERS Hob
;
75 EFI_RESOURCE_ATTRIBUTE_PRESENT
|
76 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
77 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
78 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
79 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
80 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
83 Status
= PeiServicesGetBootMode (&BootMode
);
84 ASSERT_EFI_ERROR (Status
);
86 if (BootMode
!= BOOT_ON_S3_RESUME
) {
87 ResourceAttribute
|= EFI_RESOURCE_ATTRIBUTE_TESTED
;
90 *HighMemoryLength
= 0;
91 *LowMemoryLength
= SIZE_1MB
;
93 // Get the HOB list for processing
95 Hob
.Raw
= GetHobList ();
98 // Collect memory ranges
100 while (!END_OF_HOB_LIST (Hob
)) {
101 if (Hob
.Header
->HobType
== EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
) {
102 if ((Hob
.ResourceDescriptor
->ResourceType
== EFI_RESOURCE_SYSTEM_MEMORY
) ||
103 ((Hob
.ResourceDescriptor
->ResourceType
== EFI_RESOURCE_MEMORY_RESERVED
) &&
104 (Hob
.ResourceDescriptor
->ResourceAttribute
== ResourceAttribute
)))
107 // Need memory above 1MB to be collected here
109 if ((Hob
.ResourceDescriptor
->PhysicalStart
>= BASE_1MB
) &&
110 (Hob
.ResourceDescriptor
->PhysicalStart
< (EFI_PHYSICAL_ADDRESS
)BASE_4GB
))
112 *LowMemoryLength
+= (UINT64
)(Hob
.ResourceDescriptor
->ResourceLength
);
113 } else if (Hob
.ResourceDescriptor
->PhysicalStart
>= (EFI_PHYSICAL_ADDRESS
)BASE_4GB
) {
114 *HighMemoryLength
+= (UINT64
)(Hob
.ResourceDescriptor
->ResourceLength
);
119 Hob
.Raw
= GET_NEXT_HOB (Hob
);