Home | History | Annotate | Download | only in BaseFspPlatformLib
      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
     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
     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