]> git.proxmox.com Git - mirror_edk2.git/blob - IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformMemory.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / IntelFsp2Pkg / Library / BaseFspPlatformLib / FspPlatformMemory.c
1 /** @file
2
3 Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
4 SPDX-License-Identifier: BSD-2-Clause-Patent
5
6 **/
7
8 #include <PiPei.h>
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>
18 #include <FspEas.h>
19
20 /**
21 Get system memory resource descriptor by owner.
22
23 @param[in] OwnerGuid resource owner guid
24 **/
25 EFI_HOB_RESOURCE_DESCRIPTOR *
26 EFIAPI
27 FspGetResourceDescriptorByOwner (
28 IN EFI_GUID *OwnerGuid
29 )
30 {
31 EFI_PEI_HOB_POINTERS Hob;
32
33 //
34 // Get the HOB list for processing
35 //
36 Hob.Raw = GetHobList ();
37
38 //
39 // Collect memory ranges
40 //
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;
46 }
47 }
48 Hob.Raw = GET_NEXT_HOB (Hob);
49 }
50
51 return NULL;
52 }
53
54 /**
55 Get system memory from HOB.
56
57 @param[in,out] LowMemoryLength less than 4G memory length
58 @param[in,out] HighMemoryLength greater than 4G memory length
59 **/
60 VOID
61 EFIAPI
62 FspGetSystemMemorySize (
63 IN OUT UINT64 *LowMemoryLength,
64 IN OUT UINT64 *HighMemoryLength
65 )
66 {
67 EFI_STATUS Status;
68 EFI_BOOT_MODE BootMode;
69 EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute;
70 EFI_PEI_HOB_POINTERS Hob;
71
72 ResourceAttribute = (
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
79 );
80
81 Status = PeiServicesGetBootMode (&BootMode);
82 ASSERT_EFI_ERROR (Status);
83
84 if (BootMode != BOOT_ON_S3_RESUME) {
85 ResourceAttribute |= EFI_RESOURCE_ATTRIBUTE_TESTED;
86 }
87
88 *HighMemoryLength = 0;
89 *LowMemoryLength = SIZE_1MB;
90 //
91 // Get the HOB list for processing
92 //
93 Hob.Raw = GetHobList ();
94
95 //
96 // Collect memory ranges
97 //
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))) {
103 //
104 // Need memory above 1MB to be collected here
105 //
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);
111 }
112 }
113 }
114 Hob.Raw = GET_NEXT_HOB (Hob);
115 }
116 }