123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- /** @file
- Do Platform Stage System Agent initialization.
- Copyright (c) 2019 - 2020 Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include "PeiSaPolicyUpdate.h"
- #include <Protocol/GraphicsOutput.h>
- #include <IndustryStandard/Bmp.h>
- #include <Guid/MemoryTypeInformation.h>
- #include <Library/HobLib.h>
- #include <Platform.h>
- #include <Ppi/FirmwareVolume.h>
- #include <Pi/PiFirmwareFile.h>
- #include <Pi/PiPeiCis.h>
- #include <Core/Pei/PeiMain.h>
- #include <Library/BaseMemoryLib.h>
- #include <Library/MemoryAllocationLib.h>
- #include <Library/PeiSaPolicyLib.h>
- #include <GpioPinsCnlLp.h>
- #include <GpioPinsCnlH.h>
- #include <Library/ConfigBlockLib.h>
- /**
- 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;
- }
|