コード例 #1
0
ファイル: FatLiteApi.c プロジェクト: weihu811102/edk2-FatPkg
/**
  BlockIo installation notification function. Find out all the current BlockIO
  PPIs in the system and add them into private data. Assume there is

  @param  PeiServices             General purpose services available to every
                                  PEIM.
  @param  NotifyDescriptor        The typedef structure of the notification
                                  descriptor. Not used in this function.
  @param  Ppi                     The typedef structure of the PPI descriptor.
                                  Not used in this function.

  @retval EFI_SUCCESS             The function completed successfully.

**/
EFI_STATUS
EFIAPI
BlockIoNotifyEntry (
    IN EFI_PEI_SERVICES           **PeiServices,
    IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
    IN VOID                       *Ppi
)
{
    if (CompareGuid (NotifyDescriptor->Guid, &gEfiPeiVirtualBlockIo2PpiGuid)) {
        UpdateBlocksAndVolumes (mPrivateData, TRUE);
    } else {
        UpdateBlocksAndVolumes (mPrivateData, FALSE);
    }
    return EFI_SUCCESS;
}
コード例 #2
0
ファイル: PeiCdExpress.c プロジェクト: shivamurthy/hikey-edk2
/**
  Returns the number of DXE capsules residing on the device.

  This function searches for DXE capsules from the associated device and returns
  the number and maximum size in bytes of the capsules discovered. Entry 1 is
  assumed to be the highest load priority and entry N is assumed to be the lowest
  priority.

  @param[in]  PeiServices              General-purpose services that are available
                                       to every PEIM
  @param[in]  This                     Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI
                                       instance.
  @param[out] NumberRecoveryCapsules   Pointer to a caller-allocated UINTN. On
                                       output, *NumberRecoveryCapsules contains
                                       the number of recovery capsule images
                                       available for retrieval from this PEIM
                                       instance.

  @retval EFI_SUCCESS        One or more capsules were discovered.
  @retval EFI_DEVICE_ERROR   A device error occurred.
  @retval EFI_NOT_FOUND      A recovery DXE capsule cannot be found.

**/
EFI_STATUS
EFIAPI
GetNumberRecoveryCapsules (
    IN EFI_PEI_SERVICES                               **PeiServices,
    IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI             *This,
    OUT UINTN                                         *NumberRecoveryCapsules
)
{
    PEI_CD_EXPRESS_PRIVATE_DATA *PrivateData;

    PrivateData = PEI_CD_EXPRESS_PRIVATE_DATA_FROM_THIS (This);
    UpdateBlocksAndVolumes (PrivateData, TRUE);
    UpdateBlocksAndVolumes (PrivateData, FALSE);
    *NumberRecoveryCapsules = PrivateData->CapsuleCount;

    if (*NumberRecoveryCapsules == 0) {
        return EFI_NOT_FOUND;
    }

    return EFI_SUCCESS;
}
コード例 #3
0
ファイル: PeiCdExpress.c プロジェクト: shivamurthy/hikey-edk2
/**
  Installs the Device Recovery Module PPI, Initialize BlockIo Ppi
  installation notification

  @param  FileHandle            The file handle of the image.
  @param  PeiServices           General purpose services available to every PEIM.

  @retval EFI_SUCCESS           The function completed successfully.
  @retval EFI_OUT_OF_RESOURCES  There is not enough system memory.

**/
EFI_STATUS
EFIAPI
CdExpressPeimEntry (
    IN EFI_PEI_FILE_HANDLE       FileHandle,
    IN CONST EFI_PEI_SERVICES    **PeiServices
)
{
    EFI_STATUS                  Status;
    PEI_CD_EXPRESS_PRIVATE_DATA *PrivateData;

    if (!EFI_ERROR (PeiServicesRegisterForShadow (FileHandle))) {
        return EFI_SUCCESS;
    }

    PrivateData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (*PrivateData)));
    if (PrivateData == NULL) {
        return EFI_OUT_OF_RESOURCES;
    }

    //
    // Initialize Private Data (to zero, as is required by subsequent operations)
    //
    ZeroMem (PrivateData, sizeof (*PrivateData));
    PrivateData->Signature    = PEI_CD_EXPRESS_PRIVATE_DATA_SIGNATURE;

    PrivateData->BlockBuffer  = AllocatePages (EFI_SIZE_TO_PAGES (PEI_CD_BLOCK_SIZE));
    if (PrivateData->BlockBuffer == NULL) {
        return EFI_OUT_OF_RESOURCES;
    }

    PrivateData->CapsuleCount = 0;
    Status = UpdateBlocksAndVolumes (PrivateData, TRUE);
    Status = UpdateBlocksAndVolumes (PrivateData, FALSE);

    //
    // Installs Ppi
    //
    PrivateData->DeviceRecoveryPpi.GetNumberRecoveryCapsules  = GetNumberRecoveryCapsules;
    PrivateData->DeviceRecoveryPpi.GetRecoveryCapsuleInfo     = GetRecoveryCapsuleInfo;
    PrivateData->DeviceRecoveryPpi.LoadRecoveryCapsule        = LoadRecoveryCapsule;

    PrivateData->PpiDescriptor.Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
    PrivateData->PpiDescriptor.Guid  = &gEfiPeiDeviceRecoveryModulePpiGuid;
    PrivateData->PpiDescriptor.Ppi   = &PrivateData->DeviceRecoveryPpi;

    Status = PeiServicesInstallPpi (&PrivateData->PpiDescriptor);
    if (EFI_ERROR (Status)) {
        return EFI_OUT_OF_RESOURCES;
    }
    //
    // PrivateData is allocated now, set it to the module variable
    //
    mPrivateData = PrivateData;

    //
    // Installs Block Io Ppi notification function
    //
    PrivateData->NotifyDescriptor.Flags =
        (
            EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK
        );
    PrivateData->NotifyDescriptor.Guid    = &gEfiPeiVirtualBlockIoPpiGuid;
    PrivateData->NotifyDescriptor.Notify  = BlockIoNotifyEntry;

    PrivateData->NotifyDescriptor2.Flags =
        (
            EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |
            EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
        );
    PrivateData->NotifyDescriptor2.Guid    = &gEfiPeiVirtualBlockIo2PpiGuid;
    PrivateData->NotifyDescriptor2.Notify  = BlockIoNotifyEntry;

    return PeiServicesNotifyPpi (&PrivateData->NotifyDescriptor);

}
コード例 #4
0
ファイル: FatLiteApi.c プロジェクト: weihu811102/edk2-FatPkg
/**
  Installs the Device Recovery Module PPI, Initialize BlockIo Ppi
  installation notification

  @param  FileHandle              Handle of the file being invoked. Type
                                  EFI_PEI_FILE_HANDLE is defined in
                                  FfsFindNextFile().
  @param  PeiServices             Describes the list of possible PEI Services.

  @retval EFI_SUCCESS             The entry point was executed successfully.
  @retval EFI_OUT_OF_RESOURCES    There is no enough memory to complete the
                                  operations.

**/
EFI_STATUS
EFIAPI
FatPeimEntry (
    IN EFI_PEI_FILE_HANDLE       FileHandle,
    IN CONST EFI_PEI_SERVICES    **PeiServices
)
{
    EFI_STATUS            Status;
    EFI_PHYSICAL_ADDRESS  Address;
    PEI_FAT_PRIVATE_DATA  *PrivateData;

    Status = PeiServicesRegisterForShadow (FileHandle);
    if (!EFI_ERROR (Status)) {
        return Status;
    }

    Status = PeiServicesAllocatePages (
                 EfiBootServicesCode,
                 (sizeof (PEI_FAT_PRIVATE_DATA) - 1) / PEI_FAT_MEMMORY_PAGE_SIZE + 1,
                 &Address
             );
    if (EFI_ERROR (Status)) {
        return EFI_OUT_OF_RESOURCES;
    }

    PrivateData = (PEI_FAT_PRIVATE_DATA *) (UINTN) Address;

    //
    // Initialize Private Data (to zero, as is required by subsequent operations)
    //
    ZeroMem ((UINT8 *) PrivateData, sizeof (PEI_FAT_PRIVATE_DATA));

    PrivateData->Signature = PEI_FAT_PRIVATE_DATA_SIGNATURE;

    //
    // Installs Ppi
    //
    PrivateData->DeviceRecoveryPpi.GetNumberRecoveryCapsules  = GetNumberRecoveryCapsules;
    PrivateData->DeviceRecoveryPpi.GetRecoveryCapsuleInfo     = GetRecoveryCapsuleInfo;
    PrivateData->DeviceRecoveryPpi.LoadRecoveryCapsule        = LoadRecoveryCapsule;

    PrivateData->PpiDescriptor.Flags                          = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
    PrivateData->PpiDescriptor.Guid = &gEfiPeiDeviceRecoveryModulePpiGuid;
    PrivateData->PpiDescriptor.Ppi  = &PrivateData->DeviceRecoveryPpi;

    Status = PeiServicesInstallPpi (&PrivateData->PpiDescriptor);
    if (EFI_ERROR (Status)) {
        return EFI_OUT_OF_RESOURCES;
    }
    //
    // Other initializations
    //
    PrivateData->BlockDeviceCount = 0;

    UpdateBlocksAndVolumes (PrivateData, TRUE);
    UpdateBlocksAndVolumes (PrivateData, FALSE);

    //
    // PrivateData is allocated now, set it to the module variable
    //
    mPrivateData = PrivateData;

    //
    // Installs Block Io Ppi notification function
    //
    PrivateData->NotifyDescriptor[0].Flags =
        (
            EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK
        );
    PrivateData->NotifyDescriptor[0].Guid    = &gEfiPeiVirtualBlockIoPpiGuid;
    PrivateData->NotifyDescriptor[0].Notify  = BlockIoNotifyEntry;
    PrivateData->NotifyDescriptor[1].Flags  =
        (
            EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |
            EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
        );
    PrivateData->NotifyDescriptor[1].Guid    = &gEfiPeiVirtualBlockIo2PpiGuid;
    PrivateData->NotifyDescriptor[1].Notify  = BlockIoNotifyEntry;
    return PeiServicesNotifyPpi (&PrivateData->NotifyDescriptor[0]);
}