/** @file
Do Platform Stage System Agent initialization.
Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "PeiSaPolicyUpdate.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/**
UpdatePeiSaPolicy performs SA PEI Policy initialization
@param[in out] SiPolicyPpi - SI_POLICY PPI
@retval EFI_SUCCESS The policy is installed and initialized.
**/
EFI_STATUS
UpdatePeiSaPolicy (
IN OUT SI_POLICY_PPI *SiPolicyPpi
)
{
EFI_STATUS Status;
EFI_GUID FileGuid;
VOID *Buffer;
UINT8 SaDisplayConfigTable[9] = {0};
VOID *MemBuffer;
BMP_IMAGE_HEADER *BmpHeader;
UINT64 BltBufferSize;
UINT32 Size;
GRAPHICS_PEI_CONFIG *GtConfig;
GNA_CONFIG *GnaConfig;
WDT_PPI *gWdtPei;
PCIE_PEI_CONFIG *PciePeiConfig;
SA_MISC_PEI_CONFIG *MiscPeiConfig;
EFI_BOOT_MODE BootMode;
DEBUG((DEBUG_INFO, "\nUpdating SA Policy in Post Mem\n"));
Size = 0;
MemBuffer = NULL;
BmpHeader = NULL;
BltBufferSize = 0;
GtConfig = NULL;
GnaConfig = NULL;
Status = GetConfigBlock((VOID *) SiPolicyPpi, &gGraphicsPeiConfigGuid, (VOID *)&GtConfig);
ASSERT_EFI_ERROR(Status);
Status = GetConfigBlock((VOID *) SiPolicyPpi, &gGnaConfigGuid, (VOID *)&GnaConfig);
ASSERT_EFI_ERROR(Status);
Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSaPciePeiConfigGuid, (VOID *)&PciePeiConfig);
ASSERT_EFI_ERROR (Status);
Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSaMiscPeiConfigGuid, (VOID *)&MiscPeiConfig);
ASSERT_EFI_ERROR (Status);
//
// Locate WDT_PPI (ICC WDT PPI)
//
gWdtPei = NULL;
Status = PeiServicesLocatePpi(
&gWdtPpiGuid,
0,
NULL,
(VOID **) &gWdtPei
);
Status = PeiServicesGetBootMode(&BootMode);
ASSERT_EFI_ERROR(Status);
if (!EFI_ERROR (Status)) {
Buffer = NULL;
CopyMem(&FileGuid, PcdGetPtr(PcdIntelGraphicsVbtFileGuid), sizeof(FileGuid));
PeiGetSectionFromFv(FileGuid, &Buffer, &Size);
if (Buffer == NULL) {
DEBUG((DEBUG_ERROR, "Could not locate VBT\n"));
}
MemBuffer = (VOID *)AllocatePages (EFI_SIZE_TO_PAGES ((UINTN)Size));
if ((MemBuffer != NULL) && (Buffer != NULL)) {
CopyMem (MemBuffer, (VOID *)Buffer, (UINTN)Size);
GtConfig->GraphicsConfigPtr = MemBuffer;
} else {
DEBUG((DEBUG_WARN, "Error in locating / copying VBT.\n"));
GtConfig->GraphicsConfigPtr = NULL;
}
GtConfig->PeiGraphicsPeimInit = 1;
DEBUG((DEBUG_INFO, "Vbt Pointer from PeiGetSectionFromFv is 0x%x\n", GtConfig->GraphicsConfigPtr));
DEBUG((DEBUG_INFO, "Vbt Size from PeiGetSectionFromFv is 0x%x\n", Size));
PeiGetSectionFromFv (gTianoLogoGuid, &Buffer, &Size);
if (Buffer == NULL) {
DEBUG((DEBUG_WARN, "Could not locate Logo\n"));
}
MemBuffer = (VOID *)AllocatePages (EFI_SIZE_TO_PAGES ((UINTN)Size));
if ((MemBuffer != NULL) && (Buffer != NULL)) {
CopyMem (MemBuffer, (VOID *)Buffer, (UINTN)Size);
GtConfig->LogoPtr = MemBuffer;
GtConfig->LogoSize = Size;
//
// Calculate the BltBuffer needed size.
//
BmpHeader = (BMP_IMAGE_HEADER *) GtConfig->LogoPtr;
if (BmpHeader->CharB == 'B' && BmpHeader->CharM == 'M') {
BltBufferSize = MultU64x32 ((UINT64) BmpHeader->PixelWidth, BmpHeader->PixelHeight);
if (BltBufferSize < DivU64x32 ((UINTN) ~0, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))) {
BltBufferSize = MultU64x32 (BltBufferSize, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
GtConfig->BltBufferSize = (UINT32) BltBufferSize;
GtConfig->BltBufferAddress = (VOID *) AllocatePages (EFI_SIZE_TO_PAGES ((UINTN)GtConfig->BltBufferSize));
} else {
DEBUG ((DEBUG_ERROR, "Blt Buffer Size overflow.\n"));
ASSERT (FALSE);
}
} else {
DEBUG ((DEBUG_ERROR, "Wrong Bmp Image Header.\n"));
ASSERT (FALSE);
}
} else {
DEBUG((DEBUG_WARN, "Error in locating / copying LogoPtr.\n"));
GtConfig->LogoPtr = NULL;
GtConfig->LogoSize = 0;
}
DEBUG((DEBUG_INFO, "LogoPtr from PeiGetSectionFromFv is 0x%x\n", GtConfig->LogoPtr));
DEBUG((DEBUG_INFO, "LogoSize from PeiGetSectionFromFv is 0x%x\n", GtConfig->LogoSize));
//
// Display DDI Initialization ( default Native GPIO as per board during AUTO case)
//
if (PcdGet32 (PcdSaDisplayConfigTable) != 0) {
CopyMem (SaDisplayConfigTable, (VOID *) (UINTN) PcdGet32 (PcdSaDisplayConfigTable), (UINTN)PcdGet16 (PcdSaDisplayConfigTableSize));
GtConfig->DdiConfiguration.DdiPortEdp = SaDisplayConfigTable[0];
GtConfig->DdiConfiguration.DdiPortBHpd = SaDisplayConfigTable[1];
GtConfig->DdiConfiguration.DdiPortCHpd = SaDisplayConfigTable[2];
GtConfig->DdiConfiguration.DdiPortDHpd = SaDisplayConfigTable[3];
GtConfig->DdiConfiguration.DdiPortFHpd = SaDisplayConfigTable[4];
GtConfig->DdiConfiguration.DdiPortBDdc = SaDisplayConfigTable[5];
GtConfig->DdiConfiguration.DdiPortCDdc = SaDisplayConfigTable[6];
GtConfig->DdiConfiguration.DdiPortDDdc = SaDisplayConfigTable[7];
GtConfig->DdiConfiguration.DdiPortFDdc = SaDisplayConfigTable[8];
}
}
PciePeiConfig->DmiAspm = 0x3;
return EFI_SUCCESS;
}
/**
PeiGetSectionFromFv finds the file in FV and gets file Address and Size
@param[in] NameGuid - File GUID
@param[out] Address - Pointer to the File Address
@param[out] Size - Pointer to File Size
@retval EFI_SUCCESS Successfull in reading the section from FV
**/
EFI_STATUS
EFIAPI
PeiGetSectionFromFv (
IN CONST EFI_GUID NameGuid,
OUT VOID **Address,
OUT UINT32 *Size
)
{
EFI_STATUS Status;
EFI_PEI_FIRMWARE_VOLUME_PPI *FvPpi;
EFI_FV_FILE_INFO FvFileInfo;
PEI_CORE_INSTANCE *PrivateData;
UINTN CurrentFv;
PEI_CORE_FV_HANDLE *CoreFvHandle;
EFI_PEI_FILE_HANDLE VbtFileHandle;
EFI_GUID *VbtGuid;
EFI_COMMON_SECTION_HEADER *Section;
CONST EFI_PEI_SERVICES **PeiServices;
PeiServices = GetPeiServicesTablePointer();
PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);
Status = PeiServicesLocatePpi(
&gEfiFirmwareFileSystem2Guid,
0,
NULL,
(VOID **)&FvPpi
);
ASSERT_EFI_ERROR(Status);
CurrentFv = PrivateData->CurrentPeimFvCount;
CoreFvHandle = &(PrivateData->Fv[CurrentFv]);
Status = FvPpi->FindFileByName(FvPpi, &NameGuid, &CoreFvHandle->FvHandle, &VbtFileHandle);
if (!EFI_ERROR(Status) && VbtFileHandle != NULL) {
DEBUG((DEBUG_INFO, "Find SectionByType \n"));
Status = FvPpi->FindSectionByType(FvPpi, EFI_SECTION_RAW, VbtFileHandle, (VOID **)&VbtGuid);
if (!EFI_ERROR(Status)) {
DEBUG((DEBUG_INFO, "GetFileInfo \n"));
Status = FvPpi->GetFileInfo(FvPpi, VbtFileHandle, &FvFileInfo);
Section = (EFI_COMMON_SECTION_HEADER *)FvFileInfo.Buffer;
if (IS_SECTION2(Section)) {
ASSERT(SECTION2_SIZE(Section) > 0x00FFFFFF);
*Size = SECTION2_SIZE(Section) - sizeof (EFI_COMMON_SECTION_HEADER2);
*Address = ((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER2));
} else {
*Size = SECTION_SIZE(Section) - sizeof (EFI_COMMON_SECTION_HEADER);
*Address = ((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER));
}
}
}
return EFI_SUCCESS;
}