--- /dev/null
+/** @file\r
+\r
+ Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+ This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php.\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiPei.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/HobLib.h>\r
+#include <Library/PeiServicesLib.h>\r
+#include <Library/FspCommonLib.h>\r
+#include <FspGlobalData.h>\r
+#include <FspEas.h>\r
+\r
+/**\r
+ Get system memory resource descriptor by owner.\r
+\r
+ @param[in] OwnerGuid resource owner guid\r
+**/\r
+EFI_HOB_RESOURCE_DESCRIPTOR *\r
+EFIAPI\r
+FspGetResourceDescriptorByOwner (\r
+ IN EFI_GUID *OwnerGuid\r
+ )\r
+{\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+\r
+ //\r
+ // Get the HOB list for processing\r
+ //\r
+ Hob.Raw = GetHobList ();\r
+\r
+ //\r
+ // Collect memory ranges\r
+ //\r
+ while (!END_OF_HOB_LIST (Hob)) {\r
+ if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {\r
+ if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED) && \\r
+ (CompareGuid (&Hob.ResourceDescriptor->Owner, OwnerGuid))) {\r
+ return Hob.ResourceDescriptor; \r
+ }\r
+ }\r
+ Hob.Raw = GET_NEXT_HOB (Hob);\r
+ }\r
+ \r
+ return NULL;\r
+}\r
+\r
+/**\r
+ Get system memory from HOB.\r
+\r
+ @param[in,out] LowMemoryLength less than 4G memory length\r
+ @param[in,out] HighMemoryLength greater than 4G memory length\r
+**/\r
+VOID\r
+EFIAPI\r
+FspGetSystemMemorySize (\r
+ IN OUT UINT64 *LowMemoryLength,\r
+ IN OUT UINT64 *HighMemoryLength\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_BOOT_MODE BootMode;\r
+ EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute;\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+\r
+ ResourceAttribute = (\r
+ EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
+ EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
+ );\r
+\r
+ Status = PeiServicesGetBootMode (&BootMode);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ if (BootMode != BOOT_ON_S3_RESUME) {\r
+ ResourceAttribute |= EFI_RESOURCE_ATTRIBUTE_TESTED;\r
+ }\r
+\r
+ *HighMemoryLength = 0;\r
+ *LowMemoryLength = SIZE_1MB;\r
+ //\r
+ // Get the HOB list for processing\r
+ //\r
+ Hob.Raw = GetHobList ();\r
+\r
+ //\r
+ // Collect memory ranges\r
+ //\r
+ while (!END_OF_HOB_LIST (Hob)) {\r
+ if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {\r
+ if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) ||\r
+ ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED) &&\r
+ (Hob.ResourceDescriptor->ResourceAttribute == ResourceAttribute))) {\r
+ //\r
+ // Need memory above 1MB to be collected here\r
+ //\r
+ if (Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB &&\r
+ Hob.ResourceDescriptor->PhysicalStart < (EFI_PHYSICAL_ADDRESS) BASE_4GB) {\r
+ *LowMemoryLength += (UINT64) (Hob.ResourceDescriptor->ResourceLength);\r
+ } else if (Hob.ResourceDescriptor->PhysicalStart >= (EFI_PHYSICAL_ADDRESS) BASE_4GB) {\r
+ *HighMemoryLength += (UINT64) (Hob.ResourceDescriptor->ResourceLength);\r
+ }\r
+ }\r
+ }\r
+ Hob.Raw = GET_NEXT_HOB (Hob);\r
+ }\r
+}\r
+\r
+/**\r
+ Migrate BootLoader data before destroying CAR.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FspMigrateTemporaryMemory (\r
+ VOID\r
+ )\r
+{\r
+ UINT32 BootLoaderTempRamStart;\r
+ UINT32 BootLoaderTempRamEnd;\r
+ UINT32 BootLoaderTempRamSize;\r
+ UINT32 OffsetGap;\r
+ UINT32 FspParamPtr;\r
+ VOID *BootLoaderTempRamHob;\r
+ UINT32 MemoryInitUpdPtr;\r
+ VOID *PlatformDataPtr;\r
+\r
+ //\r
+ // Get the temporary memory range used by the BootLoader\r
+ //\r
+ BootLoaderTempRamStart = GetFspCarBase ();\r
+ BootLoaderTempRamSize = GetFspCarSize () - PcdGet32(PcdFspTemporaryRamSize);\r
+\r
+ BootLoaderTempRamEnd = BootLoaderTempRamStart + BootLoaderTempRamSize;\r
+\r
+ //\r
+ // Build a Boot Loader Temporary Memory GUID HOB\r
+ //\r
+ BootLoaderTempRamHob = (VOID *)AllocatePages (EFI_SIZE_TO_PAGES (BootLoaderTempRamSize));\r
+ ASSERT(BootLoaderTempRamHob != NULL);\r
+\r
+ DEBUG ((DEBUG_INFO, "FSP_BOOT_LOADER_TEMPORARY_MEMORY_HOB\n"));\r
+ DEBUG ((DEBUG_INFO, "FspBootLoaderTemporaryMemory Base : %x\n", BootLoaderTempRamStart));\r
+ DEBUG ((DEBUG_INFO, "FspBootLoaderTemporaryMemory Size : %x\n", BootLoaderTempRamSize));\r
+\r
+ CopyMem (BootLoaderTempRamHob, (VOID *)BootLoaderTempRamStart, BootLoaderTempRamSize);\r
+ OffsetGap = (UINT32)BootLoaderTempRamHob - BootLoaderTempRamStart;\r
+\r
+ //\r
+ // Fix the FspMemoryinit Parameter Pointers to the new location.\r
+ //\r
+ FspParamPtr = GetFspApiParameter ();\r
+ if ((VOID *)FspParamPtr != NULL && FspParamPtr >= BootLoaderTempRamStart && \r
+ FspParamPtr < BootLoaderTempRamEnd) {\r
+ SetFspApiParameter (FspParamPtr + OffsetGap);\r
+ }\r
+\r
+ //\r
+ // Update UPD pointer in FSP Global Data\r
+ //\r
+ MemoryInitUpdPtr = (UINT32)((UINT32 *)GetFspMemoryInitUpdDataPointer ());\r
+ if (MemoryInitUpdPtr >= BootLoaderTempRamStart && MemoryInitUpdPtr < BootLoaderTempRamEnd) {\r
+ SetFspMemoryInitUpdDataPointer ((VOID *)(MemoryInitUpdPtr + OffsetGap));\r
+ }\r
+\r
+ //\r
+ // Update Platform data pointer in FSP Global Data\r
+ //\r
+ PlatformDataPtr = GetFspPlatformDataPointer ();\r
+ if (((UINT32)PlatformDataPtr >= BootLoaderTempRamStart) &&\r
+ ((UINT32)PlatformDataPtr < BootLoaderTempRamEnd)) {\r
+ SetFspPlatformDataPointer ((UINT8 *)PlatformDataPtr + OffsetGap);\r
+ }\r
+}\r