Home | History | Annotate | Download | only in FvbRuntimeDxe
      1 /** @file
      2   SMM Firmware Volume Block Driver for Lakeport Platform.
      3 
      4   Firmware volume block driver for FWH or SPI device.
      5   It depends on which Flash Device Library to be linked with this driver.
      6 
      7 Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
      8 
      9   This program and the accompanying materials are licensed and made available under
     11   the terms and conditions of the BSD License that accompanies this distribution.
     13   The full text of the license may be found at
     15   http://opensource.org/licenses/bsd-license.php.
     17 
     19   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     21   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     23 
     25 
     27 **/
     28 
     29 #include <PiSmm.h>
     30 #include <Library/SmmServicesTableLib.h>
     31 #include "FvbSmmCommon.h"
     32 #include "FvbService.h"
     33 
     34 /**
     35   The function installs EFI_SMM_FIRMWARE_VOLUME_BLOCK protocol
     36   for each FV in the system.
     37 
     38   @param[in]  FwhInstance   The pointer to a FW volume instance structure,
     39                             which contains the information about one FV.
     40   @param[in]  InstanceNum   The instance number which can be used as a ID
     41                             to locate this FwhInstance in other functions.
     42 
     43   @retval     VOID
     44 
     45 **/
     46 VOID
     47 InstallFvbProtocol (
     48   IN  EFI_FW_VOL_INSTANCE               *FwhInstance,
     49   IN  UINTN                             InstanceNum
     50   )
     51 {
     52   EFI_FW_VOL_BLOCK_DEVICE               *FvbDevice;
     53   EFI_FIRMWARE_VOLUME_HEADER            *FwVolHeader;
     54   EFI_STATUS                            Status;
     55   EFI_HANDLE                            FvbHandle;
     56 
     57   FvbDevice = (EFI_FW_VOL_BLOCK_DEVICE *) AllocateRuntimeCopyPool (
     58                                             sizeof (EFI_FW_VOL_BLOCK_DEVICE),
     59                                             &mFvbDeviceTemplate
     60                                             );
     61   ASSERT (FvbDevice != NULL);
     62 
     63   FvbDevice->Instance = InstanceNum;
     64   FwVolHeader         = &FwhInstance->VolumeHeader;
     65 
     66   //
     67   // Set up the devicepath.
     68   //
     69   if (FwVolHeader->ExtHeaderOffset == 0) {
     70     //
     71     // FV does not contains extension header, then produce MEMMAP_DEVICE_PATH.
     72     //
     73     FvbDevice->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocateRuntimeCopyPool (sizeof (FV_MEMMAP_DEVICE_PATH), &mFvMemmapDevicePathTemplate);
     74     ((FV_MEMMAP_DEVICE_PATH *) FvbDevice->DevicePath)->MemMapDevPath.StartingAddress = FwhInstance->FvBase;
     75     ((FV_MEMMAP_DEVICE_PATH *) FvbDevice->DevicePath)->MemMapDevPath.EndingAddress   = FwhInstance->FvBase + FwVolHeader->FvLength - 1;
     76   } else {
     77     FvbDevice->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocateRuntimeCopyPool (sizeof (FV_PIWG_DEVICE_PATH), &mFvPIWGDevicePathTemplate);
     78     CopyGuid (
     79       &((FV_PIWG_DEVICE_PATH *)FvbDevice->DevicePath)->FvDevPath.FvName,
     80       (GUID *)(UINTN)(FwhInstance->FvBase + FwVolHeader->ExtHeaderOffset)
     81       );
     82   }
     83 
     84   //
     85   // Install the SMM Firmware Volume Block Protocol and Device Path Protocol.
     86   //
     87   FvbHandle = NULL;
     88   Status = gSmst->SmmInstallProtocolInterface (
     89                     &FvbHandle,
     90                     &gEfiSmmFirmwareVolumeBlockProtocolGuid,
     91                     EFI_NATIVE_INTERFACE,
     92                     &FvbDevice->FwVolBlockInstance
     93                     );
     94   ASSERT_EFI_ERROR (Status);
     95 
     96   Status = gSmst->SmmInstallProtocolInterface (
     97                     &FvbHandle,
     98                     &gEfiDevicePathProtocolGuid,
     99                     EFI_NATIVE_INTERFACE,
    100                     FvbDevice->DevicePath
    101                     );
    102   ASSERT_EFI_ERROR (Status);
    103 
    104   //
    105   // Notify the Fvb wrapper driver SMM fvb is ready.
    106   //
    107   FvbHandle = NULL;
    108   Status = gBS->InstallProtocolInterface (
    109                   &FvbHandle,
    110                   &gEfiSmmFirmwareVolumeBlockProtocolGuid,
    111                   EFI_NATIVE_INTERFACE,
    112                   &FvbDevice->FwVolBlockInstance
    113                   );
    114 }
    115 
    116 
    117 /**
    118   The driver entry point for SMM Firmware Volume Block Driver.
    119 
    120   The function does the necessary initialization work
    121   Firmware Volume Block Driver.
    122 
    123   @param[in]  ImageHandle       The firmware allocated handle for the UEFI image.
    124   @param[in]  SystemTable       A pointer to the EFI system table.
    125 
    126   @retval     EFI_SUCCESS       This funtion always return EFI_SUCCESS.
    127                                 It will ASSERT on errors.
    128 
    129 **/
    130 EFI_STATUS
    131 EFIAPI
    132 FvbSmmInitialize (
    133   IN EFI_HANDLE         ImageHandle,
    134   IN EFI_SYSTEM_TABLE   *SystemTable
    135   )
    136 {
    137   FvbInitialize ();
    138 
    139   return EFI_SUCCESS;
    140 }
    141 
    142