Home | History | Annotate | Download | only in FirmwareVolumePei
      1 /*++ @file
      2 
      3 Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
      4 Portions copyright (c) 2011, Apple Inc. All rights reserved.
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #include "PiPei.h"
     16 #include <Ppi/EmuThunk.h>
     17 #include <Library/DebugLib.h>
     18 #include <Library/PeimEntryPoint.h>
     19 #include <Library/HobLib.h>
     20 #include <Library/PeiServicesLib.h>
     21 #include <Library/PeiServicesTablePointerLib.h>
     22 #include <Library/PcdLib.h>
     23 
     24 EFI_STATUS
     25 EFIAPI
     26 PeimInitializeFirmwareVolumePei (
     27   IN       EFI_PEI_FILE_HANDLE       FileHandle,
     28   IN CONST EFI_PEI_SERVICES          **PeiServices
     29   )
     30 /*++
     31 
     32 Routine Description:
     33   Perform a call-back into the SEC simulator to get address of the Firmware Hub
     34 
     35 Arguments:
     36   FfsHeader   - Ffs Header availible to every PEIM
     37   PeiServices - General purpose services available to every PEIM.
     38 
     39 Returns:
     40   None
     41 
     42 **/
     43 {
     44   EFI_STATUS                  Status;
     45   EFI_PEI_PPI_DESCRIPTOR      *PpiDescriptor;
     46   EMU_THUNK_PPI               *Thunk;
     47   EFI_PHYSICAL_ADDRESS        FdBase;
     48   EFI_PHYSICAL_ADDRESS        FdFixUp;
     49   EFI_FIRMWARE_VOLUME_HEADER  *FvHeader;
     50   UINT64                      FdSize;
     51   UINTN                       Index;
     52 
     53   DEBUG ((EFI_D_ERROR, "Unix Firmware Volume PEIM Loaded\n"));
     54 
     55   //
     56   // Get the Fwh Information PPI
     57   //
     58   Status = PeiServicesLocatePpi (
     59               &gEmuThunkPpiGuid,  // GUID
     60               0,                  // INSTANCE
     61               &PpiDescriptor,     // EFI_PEI_PPI_DESCRIPTOR
     62               (VOID **)&Thunk     // PPI
     63               );
     64   ASSERT_EFI_ERROR (Status);
     65 
     66   Index = 0;
     67   do {
     68     //
     69     // Get information about all the FD's in the system
     70     //
     71     Status = Thunk->FirmwareDevices (Index, &FdBase, &FdSize, &FdFixUp);
     72     if (!EFI_ERROR (Status)) {
     73       //
     74       // Assume the FD starts with an FV header
     75       //
     76       FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) FdBase;
     77 
     78       //
     79       // Make an FV Hob for the first FV in the FD
     80       //
     81       BuildFvHob (FdBase, FvHeader->FvLength);
     82 
     83       if (Index == 0) {
     84         //
     85         // Assume the first FD was produced by the NT32.DSC
     86         //  All these strange offests are needed to keep in
     87         //  sync with the FlashMap and NT32.dsc file
     88         //
     89         BuildResourceDescriptorHob (
     90           EFI_RESOURCE_FIRMWARE_DEVICE,
     91           (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE),
     92           FdBase,
     93           (
     94             FvHeader->FvLength +
     95             PcdGet32 (PcdFlashNvStorageVariableSize) +
     96             PcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
     97             PcdGet32 (PcdFlashNvStorageFtwSpareSize) +
     98             PcdGet32 (PcdEmuFlashNvStorageEventLogSize)
     99           )
    100         );
    101 
    102         //
    103         // Hard code the address of the spare block and variable services.
    104         //  Assume it's a hard coded offset from FV0 in FD0.
    105         //
    106         FdSize  =
    107           PcdGet32 (PcdFlashNvStorageVariableSize) +
    108           PcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
    109           PcdGet32 (PcdFlashNvStorageFtwSpareSize) +
    110           PcdGet32 (PcdEmuFlashNvStorageEventLogSize);
    111 
    112         BuildFvHob (FdFixUp + PcdGet64 (PcdEmuFlashNvStorageVariableBase), FdSize);
    113       } else {
    114         //
    115         // For other FD's just map them in.
    116         //
    117         BuildResourceDescriptorHob (
    118           EFI_RESOURCE_FIRMWARE_DEVICE,
    119           (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE),
    120           FdBase,
    121           FdSize
    122           );
    123       }
    124     }
    125 
    126     Index++;
    127   } while (!EFI_ERROR (Status));
    128 
    129   return Status;
    130 }
    131