alder_lake_bios/Oem/L05/FeatureCommon/InsydeL05ModulePkg/Library/FlashProtectRegionLib/FlashProtectRegionLib.c

178 lines
8.3 KiB
C

/** @file
Instance of Flash Protect Region Library.
;******************************************************************************
;* Copyright (c) 2020, Insyde Software Corporation. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include <Uefi.h>
#include <L05ChipsetNameList.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/FlashProtectRegionLib.h>
#include <Library/FeatureLib/OemSvcFeatureGetProtectTable.h>
EFI_L05_FLASH_PROTECT_ENTRY mDefaultProtectTable[] = {
// SupportProtectStage, LinearAddress, Size
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashNvStorageMsdmDataBase), FixedPcdGet32 (PcdFlashNvStorageMsdmDataSize)}},
#ifdef L05_SPECIFIC_VARIABLE_SERVICE_ENABLE
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvL05Variable1Base), FixedPcdGet32 (PcdFlashFvL05Variable1Size)}},
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvL05Variable2Base), FixedPcdGet32 (PcdFlashFvL05Variable2Size)}},
#else
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvEepromBase), FixedPcdGet32 (PcdFlashFvEepromSize)}},
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvSystemSupervisorPasswordBase), FixedPcdGet32 (PcdFlashFvSystemSupervisorPasswordSize)}},
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvSystemUserPasswordBase), FixedPcdGet32 (PcdFlashFvSystemUserPasswordSize)}},
#endif
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdL05FlashFvSlp20Base), FixedPcdGet32 (PcdL05FlashFvSlp20Size)}},
#ifdef L05_COMPUTRACE_ENABLE
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvL05ComputraceRegionBase), FixedPcdGet32 (PcdFlashFvL05ComputraceRegionSize)}},
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvL05ComputraceFvBase), FixedPcdGet32 (PcdFlashFvL05ComputraceFvSize)}},
#endif
#ifdef L05_CUSTOMIZE_MULTI_LOGO_SUPPORT
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvL05CustomizeMultiLogoBase), FixedPcdGet32 (PcdFlashFvL05CustomizeMultiLogoSize)}},
#endif
#ifdef L05_BIOS_SELF_HEALING_SUPPORT
#if (FixedPcdGet32 (PcdL05ChipsetName) == L05_CHIPSET_NAME_TIGERLAKE)
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvL05BackupIbbBase), FixedPcdGet32 (PcdFlashFvL05BackupIbbSize)}},
#endif
#if (FixedPcdGet32 (PcdL05ChipsetName) == L05_CHIPSET_NAME_CEZANNE)
#ifdef CZN_COMBO_SUPPORT
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashCznPspDirLv2BBase), FixedPcdGet32 (PcdFlashCznPspDirLv2BSize)}},
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashCznBiosDirLv2BBase), FixedPcdGet32 (PcdFlashCznBiosDirLv2BSize)}},
#endif
#ifdef LCN_COMBO_SUPPORT
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashRnPspDirLv2BBase), FixedPcdGet32 (PcdFlashRnPspDirLv2BSize)}},
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashRnBiosDirLv2BBase), FixedPcdGet32 (PcdFlashRnBiosDirLv2BSize)}},
#endif
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvRecoveryPadBase), FixedPcdGet32 (PcdFlashFvRecoveryPadSize)}},
#endif
#if (FixedPcdGet32 (PcdL05ChipsetName) == L05_CHIPSET_NAME_REMBRANDT)
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashPspDirBBase), FixedPcdGet32 (PcdFlashPspDirBSize)}},
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashBiosDirBBase), FixedPcdGet32 (PcdFlashBiosDirBSize)}},
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashPeiFlashBBase), FixedPcdGet32 (PcdFlashPeiFlashBSize)}},
#endif
// According to Lenovo's request, Self-Healing recovery should not change user settings and status
{(SelfHealing), {FixedPcdGet32 (PcdFlashNvStorageVariableBase), FixedPcdGet32 (PcdFlashNvStorageVariableSize)}},
{(SelfHealing), {FixedPcdGet32 (PcdFlashNvStorageFtwWorkingBase), FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize)}},
{(SelfHealing), {FixedPcdGet32 (PcdFlashNvStorageFtwSpareBase), FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize)}},
#endif
//[-start-211117-Dongxu0031-add]//
#ifdef LCFC_SUPPORT
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvLvarSub1Base), FixedPcdGet32 (PcdFlashFvLvarSub1Size)}},
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvLvarSub2Base), FixedPcdGet32 (PcdFlashFvLvarSub2Size)}},
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvLvarDebugBase), FixedPcdGet32 (PcdFlashFvLvarDebugSize)}},
#ifdef L05_COMPUTRACE_ENABLE
{(Ihisi | Crisis | SelfHealing), {FixedPcdGet32 (PcdFlashFvL05ComputraceRegionBase), FixedPcdGet32 (PcdFlashFvL05ComputraceRegionSize)}},
#endif
#endif
//[-end-211117-Dongxu0031-add]//
};
/**
Check if the region should be protected when updating BIOS.
@param Region Point to region data.
@param FlashStage Flash stage.
@retval TRUE Region needs protection.
@retval FALSE Region does not need protection.
**/
BOOLEAN
NeedToProtect (
IN EFI_L05_FLASH_PROTECT_ENTRY *Region,
IN EFI_L05_FLASH_STAGE FlashStage
)
{
return ((Region->SupportProtectStage & FlashStage) == FlashStage) ? TRUE : FALSE;
}
/**
Get flash protect table.
@param ProtectTable Point to protect table.
The caller is responsible to free the memory.
@param Count Table count.
@param FlashStage Flash stage.
@retval EFI_SUCCESS The operation completed successfully.
@retval Others An unexpected error occurred.
**/
EFI_STATUS
GetFlashProtectTable (
OUT EFI_L05_FLASH_PROTECT_REGION **ProtectTable,
OUT UINTN *Count,
IN EFI_L05_FLASH_STAGE FlashStage
)
{
EFI_STATUS Status;
EFI_L05_FLASH_PROTECT_ENTRY *TempBuff;
UINTN TempCount;
EFI_L05_FLASH_PROTECT_ENTRY *EntryPtr;
UINTN EntryCount;
UINTN Index;
UINTN Index2;
*ProtectTable = NULL;
*Count = 0;
TempBuff = NULL;
TempCount = 0;
EntryPtr = NULL;
EntryCount = 0;
TempBuff = AllocateZeroPool (sizeof (EFI_L05_FLASH_PROTECT_ENTRY) * L05_DEFAULT_PROTECT_TABLE_SIZE);
if (TempBuff == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (TempBuff, mDefaultProtectTable, sizeof (mDefaultProtectTable));
TempCount = sizeof (mDefaultProtectTable) / sizeof (EFI_L05_FLASH_PROTECT_ENTRY);
Status = OemSvcFeatureGetProtectTable (&TempBuff, &TempCount);
if ((Status != EFI_MEDIA_CHANGED) ||
((Status == EFI_MEDIA_CHANGED) && ((TempBuff == NULL) || (TempCount == 0)))) {
EntryPtr = mDefaultProtectTable;
EntryCount = sizeof (mDefaultProtectTable) / sizeof (EFI_L05_FLASH_PROTECT_ENTRY);
} else {
EntryPtr = TempBuff;
EntryCount = TempCount;
}
for (Index = 0; Index < EntryCount; Index++) {
if (NeedToProtect (&EntryPtr[Index], FlashStage)) {
(*Count)++;
}
}
if (*Count == 0) {
FreePool (TempBuff);
return EFI_NOT_FOUND;
}
*ProtectTable = AllocateZeroPool (sizeof (EFI_L05_FLASH_PROTECT_REGION) * *Count);
if (*ProtectTable == NULL) {
*Count = 0;
FreePool (TempBuff);
return EFI_OUT_OF_RESOURCES;
}
for (Index = 0, Index2 = 0; Index < EntryCount; Index++) {
if (NeedToProtect (&EntryPtr[Index], FlashStage)) {
(*ProtectTable)[Index2].LinearAddress = EntryPtr[Index].Region.LinearAddress;
(*ProtectTable)[Index2].Size = EntryPtr[Index].Region.Size;
Index2++;
}
}
FreePool (TempBuff);
return EFI_SUCCESS;
}