]> 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 {
46 return Hob.ResourceDescriptor;
47 }
48 }
49
50 Hob.Raw = GET_NEXT_HOB (Hob);
51 }
52
53 return NULL;
54 }
55
56 /**
57 Get system memory from HOB.
58
59 @param[in,out] LowMemoryLength less than 4G memory length
60 @param[in,out] HighMemoryLength greater than 4G memory length
61 **/
62 VOID
63 EFIAPI
64 FspGetSystemMemorySize (
65 IN OUT UINT64 *LowMemoryLength,
66 IN OUT UINT64 *HighMemoryLength
67 )
68 {
69 EFI_STATUS Status;
70 EFI_BOOT_MODE BootMode;
71 EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute;
72 EFI_PEI_HOB_POINTERS Hob;
73
74 ResourceAttribute = (
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
81 );
82
83 Status = PeiServicesGetBootMode (&BootMode);
84 ASSERT_EFI_ERROR (Status);
85
86 if (BootMode != BOOT_ON_S3_RESUME) {
87 ResourceAttribute |= EFI_RESOURCE_ATTRIBUTE_TESTED;
88 }
89
90 *HighMemoryLength = 0;
91 *LowMemoryLength = SIZE_1MB;
92 //
93 // Get the HOB list for processing
94 //
95 Hob.Raw = GetHobList ();
96
97 //
98 // Collect memory ranges
99 //
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)))
105 {
106 //
107 // Need memory above 1MB to be collected here
108 //
109 if ((Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB) &&
110 (Hob.ResourceDescriptor->PhysicalStart < (EFI_PHYSICAL_ADDRESS)BASE_4GB))
111 {
112 *LowMemoryLength += (UINT64)(Hob.ResourceDescriptor->ResourceLength);
113 } else if (Hob.ResourceDescriptor->PhysicalStart >= (EFI_PHYSICAL_ADDRESS)BASE_4GB) {
114 *HighMemoryLength += (UINT64)(Hob.ResourceDescriptor->ResourceLength);
115 }
116 }
117 }
118
119 Hob.Raw = GET_NEXT_HOB (Hob);
120 }
121 }