Home | History | Annotate | Download | only in FspInitPei
      1 /** @file
      2   In FSP API V1 mode, it will be invoked twice by pei core. In 1st entry, it will
      3   call FspInit API. In 2nd entry, it will parse the hoblist from fsp and report
      4   them into pei core.
      5 
      6   Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
      7   This program and the accompanying materials
      8   are licensed and made available under the terms and conditions of the BSD License
      9   which accompanies this distribution.  The full text of the license may be found at
     10   http://opensource.org/licenses/bsd-license.php.
     11 
     12   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 
     15 **/
     16 
     17 
     18 #include "FspInitPei.h"
     19 
     20 /**
     21   FSP Init continuation function.
     22   Control will be returned to this callback function after FspInit API call.
     23 
     24   @param[in] Status      Status of the FSP INIT API
     25   @param[in] HobListPtr  Pointer to the HOB data structure defined in the PI specification.
     26 
     27 **/
     28 VOID
     29 ContinuationFunc (
     30   IN EFI_STATUS Status,
     31   IN VOID       *HobListPtr
     32   )
     33 {
     34   EFI_BOOT_MODE             BootMode;
     35   UINT64                    StackSize;
     36   EFI_PHYSICAL_ADDRESS      StackBase;
     37 
     38   DEBUG ((DEBUG_INFO, "ContinuationFunc - %r\n", Status));
     39   DEBUG ((DEBUG_INFO, "HobListPtr - 0x%x\n", HobListPtr));
     40 
     41   if (Status != EFI_SUCCESS) {
     42     CpuDeadLoop ();
     43   }
     44 
     45   //
     46   // Can not call any PeiServices
     47   //
     48   BootMode = GetBootMode ();
     49 
     50   GetStackInfo (BootMode, TRUE, &StackSize, &StackBase);
     51   DEBUG ((DEBUG_INFO, "StackBase - 0x%x\n", StackBase));
     52   DEBUG ((DEBUG_INFO, "StackSize - 0x%x\n", StackSize));
     53   CallPeiCoreEntryPoint (
     54     HobListPtr,
     55     (VOID *)(UINTN)StackBase,
     56     (VOID *)(UINTN)(StackBase + StackSize)
     57     );
     58 }
     59 
     60 /**
     61   Call FspInit API.
     62 
     63   @param[in] FspHeader FSP header pointer.
     64 **/
     65 VOID
     66 PeiFspInit (
     67   IN FSP_INFO_HEADER *FspHeader
     68   )
     69 {
     70   FSP_INIT_PARAMS           FspInitParams;
     71   FSP_INIT_RT_COMMON_BUFFER FspRtBuffer;
     72   UINT8                     FspUpdRgn[FixedPcdGet32 (PcdMaxUpdRegionSize)];
     73   UINT32                    UpdRegionSize;
     74   EFI_BOOT_MODE             BootMode;
     75   UINT64                    StackSize;
     76   EFI_PHYSICAL_ADDRESS      StackBase;
     77   EFI_STATUS                Status;
     78 
     79   DEBUG ((DEBUG_INFO, "PeiFspInit enter\n"));
     80 
     81   PeiServicesGetBootMode (&BootMode);
     82   DEBUG ((DEBUG_INFO, "BootMode - 0x%x\n", BootMode));
     83 
     84   GetStackInfo (BootMode, FALSE, &StackSize, &StackBase);
     85   DEBUG ((DEBUG_INFO, "StackBase - 0x%x\n", StackBase));
     86   DEBUG ((DEBUG_INFO, "StackSize - 0x%x\n", StackSize));
     87 
     88   ZeroMem (&FspRtBuffer, sizeof(FspRtBuffer));
     89   FspRtBuffer.StackTop = (UINT32 *)(UINTN)(StackBase + StackSize);
     90 
     91   FspRtBuffer.BootMode = BootMode;
     92 
     93   /* Platform override any UPD configs */
     94   UpdRegionSize = GetUpdRegionSize();
     95   DEBUG ((DEBUG_INFO, "UpdRegionSize - 0x%x\n", UpdRegionSize));
     96   DEBUG ((DEBUG_INFO, "sizeof(FspUpdRgn) - 0x%x\n", sizeof(FspUpdRgn)));
     97   ASSERT(sizeof(FspUpdRgn) >= UpdRegionSize);
     98   ZeroMem (FspUpdRgn, UpdRegionSize);
     99   FspRtBuffer.UpdDataRgnPtr = UpdateFspUpdConfigs (FspUpdRgn);
    100   FspRtBuffer.BootLoaderTolumSize = 0;
    101 
    102   ZeroMem (&FspInitParams, sizeof(FspInitParams));
    103   FspInitParams.NvsBufferPtr = GetNvsBuffer ();
    104   DEBUG ((DEBUG_INFO, "NvsBufferPtr - 0x%x\n", FspInitParams.NvsBufferPtr));
    105   FspInitParams.RtBufferPtr  = (VOID *)&FspRtBuffer;
    106   FspInitParams.ContinuationFunc = (CONTINUATION_PROC)ContinuationFunc;
    107 
    108   SaveSecContext (GetPeiServicesTablePointer ());
    109 
    110   DEBUG ((DEBUG_INFO, "FspInitParams      - 0x%x\n", &FspInitParams));
    111   DEBUG ((DEBUG_INFO, "  NvsBufferPtr     - 0x%x\n", FspInitParams.NvsBufferPtr));
    112   DEBUG ((DEBUG_INFO, "  RtBufferPtr      - 0x%x\n", FspInitParams.RtBufferPtr));
    113   DEBUG ((DEBUG_INFO, "    StackTop       - 0x%x\n", FspRtBuffer.StackTop));
    114   DEBUG ((DEBUG_INFO, "    BootMode       - 0x%x\n", FspRtBuffer.BootMode));
    115   DEBUG ((DEBUG_INFO, "    UpdDataRgnPtr  - 0x%x\n", FspRtBuffer.UpdDataRgnPtr));
    116   DEBUG ((DEBUG_INFO, "  ContinuationFunc - 0x%x\n", FspInitParams.ContinuationFunc));
    117 
    118   Status = CallFspInit (FspHeader, &FspInitParams);
    119   //
    120   // Should never return
    121   //
    122   DEBUG((DEBUG_ERROR, "FSP Init failed, status: 0x%x\n", Status));
    123   CpuDeadLoop ();
    124 }
    125 
    126 /**
    127   Do FSP initialization based on FspApi version 1.
    128 
    129   @param[in] FspHeader FSP header pointer.
    130 
    131   @return FSP initialization status.
    132 **/
    133 EFI_STATUS
    134 PeiFspInitV1 (
    135   IN FSP_INFO_HEADER *FspHeader
    136   )
    137 {
    138   EFI_STATUS           Status;
    139   FSP_INIT_DONE_PPI    *FspInitDone;
    140   VOID                 *FspHobList;
    141   EFI_BOOT_MODE        BootMode;
    142 
    143   Status = PeiServicesLocatePpi (
    144              &gFspInitDonePpiGuid,
    145              0,
    146              NULL,
    147              (VOID **) &FspInitDone
    148              );
    149   if (EFI_ERROR (Status)) {
    150     //
    151     // 1st entry
    152     //
    153     DEBUG ((DEBUG_INFO, "1st entry\n"));
    154 
    155     PeiFspInit (FspHeader);
    156     //
    157     // Never return here, for FspApi version 1.
    158     //
    159     CpuDeadLoop ();
    160   } else {
    161     //
    162     // 2nd entry for FspApi version 1 only.
    163     //
    164     DEBUG ((DEBUG_INFO, "2nd entry\n"));
    165 
    166     Status = FspInitDone->GetFspHobList (GetPeiServicesTablePointer (), FspInitDone, &FspHobList);
    167     ASSERT_EFI_ERROR (Status);
    168     DEBUG ((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));
    169     FspHobProcess (FspHobList);
    170 
    171     //
    172     // Register EndOfPei Notify for S3 to run FspNotifyPhase
    173     //
    174     PeiServicesGetBootMode (&BootMode);
    175     if (BootMode == BOOT_ON_S3_RESUME) {
    176       Status = PeiServicesNotifyPpi (&mS3EndOfPeiNotifyDesc);
    177       ASSERT_EFI_ERROR (Status);
    178     }
    179   }
    180 
    181   return EFI_SUCCESS;
    182 }