/** @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; }