• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2 
3   Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
4   This program and the accompanying materials
5   are licensed and made available under the terms and conditions of the BSD License
6   which accompanies this distribution.  The full text of the license may be found at
7   http://opensource.org/licenses/bsd-license.php.
8 
9   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 
12 **/
13 
14 #include <PiPei.h>
15 #include <Library/BaseLib.h>
16 #include <Library/BaseMemoryLib.h>
17 #include <Library/MemoryAllocationLib.h>
18 #include <Library/DebugLib.h>
19 #include <Library/PcdLib.h>
20 #include <Library/HobLib.h>
21 #include <Library/PeiServicesLib.h>
22 #include <Library/FspCommonLib.h>
23 #include <Guid/GuidHobFsp.h>
24 #include <FspGlobalData.h>
25 #include <FspApi.h>
26 
27 /**
28   Get system memory from HOB.
29 
30   @param[in,out] LowMemoryLength   less than 4G memory length
31   @param[in,out] HighMemoryLength  greater than 4G memory length
32 **/
33 VOID
34 EFIAPI
FspGetSystemMemorySize(IN OUT UINT64 * LowMemoryLength,IN OUT UINT64 * HighMemoryLength)35 FspGetSystemMemorySize (
36   IN OUT UINT64              *LowMemoryLength,
37   IN OUT UINT64              *HighMemoryLength
38   )
39 {
40   EFI_PEI_HOB_POINTERS    Hob;
41 
42   *HighMemoryLength = 0;
43   *LowMemoryLength  = SIZE_1MB;
44   //
45   // Get the HOB list for processing
46   //
47   Hob.Raw = GetHobList ();
48 
49   //
50   // Collect memory ranges
51   //
52   while (!END_OF_HOB_LIST (Hob)) {
53     if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
54       if (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {
55         //
56         // Need memory above 1MB to be collected here
57         //
58         if (Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB &&
59             Hob.ResourceDescriptor->PhysicalStart < (EFI_PHYSICAL_ADDRESS) BASE_4GB) {
60           *LowMemoryLength += (UINT64) (Hob.ResourceDescriptor->ResourceLength);
61         } else if (Hob.ResourceDescriptor->PhysicalStart >= (EFI_PHYSICAL_ADDRESS) BASE_4GB) {
62           *HighMemoryLength += (UINT64) (Hob.ResourceDescriptor->ResourceLength);
63         }
64       }
65     }
66     Hob.Raw = GET_NEXT_HOB (Hob);
67   }
68 }
69 
70 /**
71   Migrate BootLoader data before destroying CAR.
72 
73 **/
74 VOID
75 EFIAPI
FspMigrateTemporaryMemory(VOID)76 FspMigrateTemporaryMemory (
77   VOID
78  )
79 {
80   FSP_INIT_RT_COMMON_BUFFER *FspInitRtBuffer;
81   UINT32                    BootLoaderTempRamStart;
82   UINT32                    BootLoaderTempRamEnd;
83   UINT32                    BootLoaderTempRamSize;
84   UINT32                    OffsetGap;
85   UINT32                    FspParamPtr;
86   FSP_INIT_PARAMS           *FspInitParams;
87   UINT32                    *NewStackTop;
88   VOID                      *BootLoaderTempRamHob;
89   UINT32                    UpdDataRgnPtr;
90   UINT32                    MemoryInitUpdPtr;
91   UINT32                    SiliconInitUpdPtr;
92   VOID                      *PlatformDataPtr;
93   UINT8                      ApiMode;
94 
95   ApiMode = GetFspApiCallingMode ();
96 
97   //
98   // Get the temporary memory range used by the BootLoader
99   //
100   BootLoaderTempRamStart = PcdGet32(PcdTemporaryRamBase);
101   BootLoaderTempRamSize  = PcdGet32(PcdTemporaryRamSize) - PcdGet32(PcdFspTemporaryRamSize);
102   BootLoaderTempRamEnd   = BootLoaderTempRamStart +  BootLoaderTempRamSize;
103 
104   //
105   // Build a Boot Loader Temporary Memory GUID HOB
106   //
107   if (ApiMode == 0) {
108     BootLoaderTempRamHob = BuildGuidHob (&gFspBootLoaderTemporaryMemoryGuid, BootLoaderTempRamSize);
109   } else {
110     BootLoaderTempRamHob = (VOID *)AllocatePages (EFI_SIZE_TO_PAGES (BootLoaderTempRamSize));
111   }
112   ASSERT(BootLoaderTempRamHob != NULL);
113 
114   CopyMem (BootLoaderTempRamHob, (VOID *)BootLoaderTempRamStart, BootLoaderTempRamSize);
115   OffsetGap = (UINT32)BootLoaderTempRamHob - BootLoaderTempRamStart;
116 
117   //
118   // Set a new stack frame for the continuation function
119   //
120   if (ApiMode == 0) {
121     FspInitParams   = (FSP_INIT_PARAMS *)GetFspApiParameter ();
122     FspInitRtBuffer = (FSP_INIT_RT_COMMON_BUFFER *)FspInitParams->RtBufferPtr;
123     NewStackTop     = (UINT32 *)FspInitRtBuffer->StackTop - 1;
124     SetFspCoreStackPointer (NewStackTop);
125   }
126 
127   //
128   // Fix the FspInit Parameter Pointers to the new location.
129   //
130   FspParamPtr = GetFspApiParameter ();
131   if (FspParamPtr >= BootLoaderTempRamStart && FspParamPtr < BootLoaderTempRamEnd) {
132     SetFspApiParameter(FspParamPtr + OffsetGap);
133   }
134 
135   FspInitParams = (FSP_INIT_PARAMS *)GetFspApiParameter ();
136   if ((UINT32)(FspInitParams->RtBufferPtr) >= BootLoaderTempRamStart &&
137       (UINT32)(FspInitParams->RtBufferPtr) <  BootLoaderTempRamEnd) {
138     FspInitParams->RtBufferPtr = (VOID *)((UINT32)(FspInitParams->RtBufferPtr) + OffsetGap);
139   }
140 
141   if ((UINT32)(FspInitParams->NvsBufferPtr) >= BootLoaderTempRamStart &&
142       (UINT32)(FspInitParams->NvsBufferPtr) <  BootLoaderTempRamEnd) {
143     FspInitParams->NvsBufferPtr = (VOID *)((UINT32)(FspInitParams->NvsBufferPtr) + OffsetGap);
144   }
145 
146   if ((UINT32)(((FSP_INIT_RT_COMMON_BUFFER *)(FspInitParams->RtBufferPtr))->UpdDataRgnPtr) >= BootLoaderTempRamStart &&
147       (UINT32)(((FSP_INIT_RT_COMMON_BUFFER *)(FspInitParams->RtBufferPtr))->UpdDataRgnPtr) <  BootLoaderTempRamEnd) {
148     ((FSP_INIT_RT_COMMON_BUFFER *)(FspInitParams->RtBufferPtr))->UpdDataRgnPtr = \
149            (VOID *)((UINT32)(((FSP_INIT_RT_COMMON_BUFFER *)(FspInitParams->RtBufferPtr))->UpdDataRgnPtr) + OffsetGap);
150   }
151 
152   //
153   // Update UPD pointer in FSP Global Data
154   //
155   if (ApiMode == 0) {
156     UpdDataRgnPtr = (UINT32)((UINT32 *)GetFspUpdDataPointer ());
157     if (UpdDataRgnPtr >= BootLoaderTempRamStart && UpdDataRgnPtr < BootLoaderTempRamEnd) {
158       MemoryInitUpdPtr = (UINT32)((UINT32 *)GetFspMemoryInitUpdDataPointer ());
159       SiliconInitUpdPtr = (UINT32)((UINT32 *)GetFspSiliconInitUpdDataPointer ());
160       SetFspUpdDataPointer ((VOID *)(UpdDataRgnPtr + OffsetGap));
161       SetFspMemoryInitUpdDataPointer ((VOID *)(MemoryInitUpdPtr + OffsetGap));
162       SetFspSiliconInitUpdDataPointer ((VOID *)(SiliconInitUpdPtr + OffsetGap));
163     }
164   } else {
165     MemoryInitUpdPtr = (UINT32)((UINT32 *)GetFspMemoryInitUpdDataPointer ());
166     if (MemoryInitUpdPtr >= BootLoaderTempRamStart && MemoryInitUpdPtr < BootLoaderTempRamEnd) {
167       SetFspMemoryInitUpdDataPointer ((VOID *)(MemoryInitUpdPtr + OffsetGap));
168     }
169   }
170 
171   //
172   // Update Platform data pointer in FSP Global Data
173   //
174   PlatformDataPtr = GetFspPlatformDataPointer ();
175   if (((UINT32)PlatformDataPtr >= BootLoaderTempRamStart) &&
176       ((UINT32)PlatformDataPtr <  BootLoaderTempRamEnd)) {
177     SetFspPlatformDataPointer ((UINT8 *)PlatformDataPtr + OffsetGap);
178   }
179 }
180