/** @file | |
Implementation of Helper routines for PEI enviroment. | |
Copyright (c) 2013-2016 Intel Corporation. | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#include <PiPei.h> | |
#include <Library/PeiServicesTablePointerLib.h> | |
#include <Library/PeiServicesLib.h> | |
#include <Library/I2cLib.h> | |
#include "CommonHeader.h" | |
// | |
// Routines defined in other source modules of this component. | |
// | |
// | |
// Routines local to this source module. | |
// | |
// | |
// Routines exported by this source module. | |
// | |
/** | |
Find pointer to RAW data in Firmware volume file. | |
@param FvNameGuid Firmware volume to search. If == NULL search all. | |
@param FileNameGuid Firmware volume file to search for. | |
@param SectionData Pointer to RAW data section of found file. | |
@param SectionDataSize Pointer to UNITN to get size of RAW data. | |
@retval EFI_SUCCESS Raw Data found. | |
@retval EFI_INVALID_PARAMETER FileNameGuid == NULL. | |
@retval EFI_NOT_FOUND Firmware volume file not found. | |
@retval EFI_UNSUPPORTED Unsupported in current enviroment (PEI or DXE). | |
**/ | |
EFI_STATUS | |
EFIAPI | |
PlatformFindFvFileRawDataSection ( | |
IN CONST EFI_GUID *FvNameGuid OPTIONAL, | |
IN CONST EFI_GUID *FileNameGuid, | |
OUT VOID **SectionData, | |
OUT UINTN *SectionDataSize | |
) | |
{ | |
EFI_STATUS Status; | |
UINTN Instance; | |
EFI_PEI_FV_HANDLE VolumeHandle; | |
EFI_PEI_FILE_HANDLE FileHandle; | |
EFI_SECTION_TYPE SearchType; | |
EFI_FV_INFO VolumeInfo; | |
EFI_FV_FILE_INFO FileInfo; | |
if (FileNameGuid == NULL || SectionData == NULL || SectionDataSize == NULL) { | |
return EFI_INVALID_PARAMETER; | |
} | |
*SectionData = NULL; | |
*SectionDataSize = 0; | |
SearchType = EFI_SECTION_RAW; | |
for (Instance = 0; !EFI_ERROR((PeiServicesFfsFindNextVolume (Instance, &VolumeHandle))); Instance++) { | |
if (FvNameGuid != NULL) { | |
Status = PeiServicesFfsGetVolumeInfo (VolumeHandle, &VolumeInfo); | |
if (EFI_ERROR (Status)) { | |
continue; | |
} | |
if (!CompareGuid (FvNameGuid, &VolumeInfo.FvName)) { | |
continue; | |
} | |
} | |
Status = PeiServicesFfsFindFileByName (FileNameGuid, VolumeHandle, &FileHandle); | |
if (!EFI_ERROR (Status)) { | |
Status = PeiServicesFfsGetFileInfo (FileHandle, &FileInfo); | |
if (EFI_ERROR (Status)) { | |
continue; | |
} | |
if (IS_SECTION2(FileInfo.Buffer)) { | |
*SectionDataSize = SECTION2_SIZE(FileInfo.Buffer) - sizeof(EFI_COMMON_SECTION_HEADER2); | |
} else { | |
*SectionDataSize = SECTION_SIZE(FileInfo.Buffer) - sizeof(EFI_COMMON_SECTION_HEADER); | |
} | |
Status = PeiServicesFfsFindSectionData (SearchType, FileHandle, SectionData); | |
if (!EFI_ERROR (Status)) { | |
return Status; | |
} | |
} | |
} | |
return EFI_NOT_FOUND; | |
} | |
/** | |
Find free spi protect register and write to it to protect a flash region. | |
@param DirectValue Value to directly write to register. | |
if DirectValue == 0 the use Base & Length below. | |
@param BaseAddress Base address of region in Flash Memory Map. | |
@param Length Length of region to protect. | |
@retval EFI_SUCCESS Free spi protect register found & written. | |
@retval EFI_NOT_FOUND Free Spi protect register not found. | |
@retval EFI_DEVICE_ERROR Unable to write to spi protect register. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
PlatformWriteFirstFreeSpiProtect ( | |
IN CONST UINT32 DirectValue, | |
IN CONST UINT32 BaseAddress, | |
IN CONST UINT32 Length | |
) | |
{ | |
return WriteFirstFreeSpiProtect ( | |
QNC_RCRB_BASE, | |
DirectValue, | |
BaseAddress, | |
Length, | |
NULL | |
); | |
} | |
/** Check if System booted with recovery Boot Stage1 image. | |
@retval TRUE If system booted with recovery Boot Stage1 image. | |
@retval FALSE If system booted with normal stage1 image. | |
**/ | |
BOOLEAN | |
EFIAPI | |
PlatformIsBootWithRecoveryStage1 ( | |
VOID | |
) | |
{ | |
BOOLEAN IsRecoveryBoot; | |
QUARK_EDKII_STAGE1_HEADER *Edk2ImageHeader; | |
Edk2ImageHeader = (QUARK_EDKII_STAGE1_HEADER *) PcdGet32 (PcdEsramStage1Base); | |
switch ((UINT8)Edk2ImageHeader->ImageIndex & QUARK_STAGE1_IMAGE_TYPE_MASK) { | |
case QUARK_STAGE1_RECOVERY_IMAGE_TYPE: | |
// | |
// Recovery Boot | |
// | |
IsRecoveryBoot = TRUE; | |
break; | |
default: | |
// | |
// Normal Boot | |
// | |
IsRecoveryBoot = FALSE; | |
break; | |
} | |
return IsRecoveryBoot; | |
} |