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
))) {
45 return Hob
.ResourceDescriptor
;
48 Hob
.Raw
= GET_NEXT_HOB (Hob
);
55 Get system memory from HOB.
57 @param[in,out] LowMemoryLength less than 4G memory length
58 @param[in,out] HighMemoryLength greater than 4G memory length
62 FspGetSystemMemorySize (
63 IN OUT UINT64
*LowMemoryLength
,
64 IN OUT UINT64
*HighMemoryLength
68 EFI_BOOT_MODE BootMode
;
69 EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute
;
70 EFI_PEI_HOB_POINTERS Hob
;
73 EFI_RESOURCE_ATTRIBUTE_PRESENT
|
74 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
75 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
76 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
77 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
78 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
81 Status
= PeiServicesGetBootMode (&BootMode
);
82 ASSERT_EFI_ERROR (Status
);
84 if (BootMode
!= BOOT_ON_S3_RESUME
) {
85 ResourceAttribute
|= EFI_RESOURCE_ATTRIBUTE_TESTED
;
88 *HighMemoryLength
= 0;
89 *LowMemoryLength
= SIZE_1MB
;
91 // Get the HOB list for processing
93 Hob
.Raw
= GetHobList ();
96 // Collect memory ranges
98 while (!END_OF_HOB_LIST (Hob
)) {
99 if (Hob
.Header
->HobType
== EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
) {
100 if ((Hob
.ResourceDescriptor
->ResourceType
== EFI_RESOURCE_SYSTEM_MEMORY
) ||
101 ((Hob
.ResourceDescriptor
->ResourceType
== EFI_RESOURCE_MEMORY_RESERVED
) &&
102 (Hob
.ResourceDescriptor
->ResourceAttribute
== ResourceAttribute
))) {
104 // Need memory above 1MB to be collected here
106 if (Hob
.ResourceDescriptor
->PhysicalStart
>= BASE_1MB
&&
107 Hob
.ResourceDescriptor
->PhysicalStart
< (EFI_PHYSICAL_ADDRESS
) BASE_4GB
) {
108 *LowMemoryLength
+= (UINT64
) (Hob
.ResourceDescriptor
->ResourceLength
);
109 } else if (Hob
.ResourceDescriptor
->PhysicalStart
>= (EFI_PHYSICAL_ADDRESS
) BASE_4GB
) {
110 *HighMemoryLength
+= (UINT64
) (Hob
.ResourceDescriptor
->ResourceLength
);
114 Hob
.Raw
= GET_NEXT_HOB (Hob
);