/** @file Implementation of Fsp SA Policy Initialization. Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** Performs FSP SA PEI Policy initialization in pre-memory. @param[in][out] FspmUpd Pointer to FSP UPD Data. @retval EFI_SUCCESS FSP UPD Data is updated. @retval EFI_NOT_FOUND Fail to locate required PPI. @retval Other FSP UPD Data update process fail. **/ EFI_STATUS EFIAPI PeiFspSaPolicyInitPreMem ( IN OUT FSPM_UPD *FspmUpd ) { SA_MISC_PEI_PREMEM_CONFIG *MiscPeiPreMemConfig; HOST_BRIDGE_PREMEM_CONFIG *HostBridgePreMemConfig; MEMORY_CONFIG_NO_CRC *MemConfigNoCrc; #if FixedPcdGet8(PcdFspModeSelection) == 0 EFI_STATUS Status; SI_PREMEM_POLICY_PPI *SiPreMemPolicyPpi; #endif DEBUG((DEBUG_INFO, "\nUpdating SA Policy in Pre Mem\n")); MiscPeiPreMemConfig = NULL; HostBridgePreMemConfig = NULL; MemConfigNoCrc = NULL; #if FixedPcdGet8(PcdFspModeSelection) == 0 // // Locate SiPreMemPolicyPpi // SiPreMemPolicyPpi = NULL; Status = PeiServicesLocatePpi( &gSiPreMemPolicyPpiGuid, 0, NULL, (VOID **) &SiPreMemPolicyPpi ); ASSERT_EFI_ERROR (Status); if ((Status == EFI_SUCCESS) && (SiPreMemPolicyPpi != NULL)) { Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi, &gSaMiscPeiPreMemConfigGuid, (VOID *) &MiscPeiPreMemConfig); ASSERT_EFI_ERROR (Status); Status = GetConfigBlock((VOID *) SiPreMemPolicyPpi, &gHostBridgePeiPreMemConfigGuid, (VOID *) &HostBridgePreMemConfig); ASSERT_EFI_ERROR(Status); Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi, &gMemoryConfigNoCrcGuid, (VOID *) &MemConfigNoCrc); ASSERT_EFI_ERROR (Status); ZeroMem ((VOID *) MemConfigNoCrc->SpdData->SpdData, sizeof (SPD_DATA_BUFFER)); } #endif UPDATE_POLICY (FspmUpd->FspmConfig.SpdAddressTable[0], MiscPeiPreMemConfig->SpdAddressTable[0], PcdGet8 (PcdMrcSpdAddressTable0)); UPDATE_POLICY (FspmUpd->FspmConfig.SpdAddressTable[1], MiscPeiPreMemConfig->SpdAddressTable[1], PcdGet8 (PcdMrcSpdAddressTable1)); UPDATE_POLICY (FspmUpd->FspmConfig.SpdAddressTable[2], MiscPeiPreMemConfig->SpdAddressTable[2], PcdGet8 (PcdMrcSpdAddressTable2)); UPDATE_POLICY (FspmUpd->FspmConfig.SpdAddressTable[3], MiscPeiPreMemConfig->SpdAddressTable[3], PcdGet8 (PcdMrcSpdAddressTable3)); if (PcdGet32 (PcdMrcSpdData)) { DEBUG((DEBUG_INFO, "PcdMrcSpdData != NULL, MemConfigNoCrc->SpdData\n")); COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr000, (VOID *)MemConfigNoCrc->SpdData->SpdData[0][0][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize)); COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr010, (VOID *)MemConfigNoCrc->SpdData->SpdData[0][1][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize)); COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr020, (VOID *)MemConfigNoCrc->SpdData->SpdData[0][2][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize)); COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr030, (VOID *)MemConfigNoCrc->SpdData->SpdData[0][3][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize)); COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr100, (VOID *)MemConfigNoCrc->SpdData->SpdData[1][0][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize)); COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr110, (VOID *)MemConfigNoCrc->SpdData->SpdData[1][1][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize)); COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr120, (VOID *)MemConfigNoCrc->SpdData->SpdData[1][2][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize)); COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr130, (VOID *)MemConfigNoCrc->SpdData->SpdData[1][3][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize)); } UPDATE_POLICY (((FSPM_UPD *) FspmUpd)->FspmConfig.TsegSize, MiscPeiPreMemConfig->TsegSize, PcdGet32 (PcdTsegSize)); UPDATE_POLICY (((FSPM_UPD *) FspmUpd)->FspmConfig.UserBd, MiscPeiPreMemConfig->UserBd, PcdGet8 (PcdSaMiscUserBd)); UPDATE_POLICY (((FSPM_UPD *) FspmUpd)->FspmConfig.MmioSizeAdjustment, HostBridgePreMemConfig->MmioSizeAdjustment, PcdGet16 (PcdSaMiscMmioSizeAdjustment)); return EFI_SUCCESS; } /** Performs FSP SA PEI Policy initialization. @param[in][out] FspsUpd Pointer to FSP UPD Data. @retval EFI_SUCCESS FSP UPD Data is updated. @retval EFI_NOT_FOUND Fail to locate required PPI. @retval Other FSP UPD Data update process fail. **/ EFI_STATUS EFIAPI UpdateGraphics( IN OUT FSPS_UPD *FspsUpd, GRAPHICS_PEI_CONFIG *GtConfig ) { EFI_STATUS Status; VOID *Buffer; UINT32 Size; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt; UINTN BltSize; UINTN Height; UINTN Width; DEBUG((DEBUG_INFO, "\nUpdating SA Policy in Post Mem\n")); UPDATE_POLICY (FspsUpd->FspsConfig.PeiGraphicsPeimInit, GtConfig->PeiGraphicsPeimInit, 1); Size = 0; Buffer = NULL; PeiGetSectionFromAnyFv(PcdGetPtr(PcdIntelGraphicsVbtFileGuid), EFI_SECTION_RAW, 0, &Buffer, &Size); DEBUG((DEBUG_INFO, "Vbt Pointer from PeiGetSectionFromAnyFv is 0x%x\n", Buffer)); DEBUG((DEBUG_INFO, "Vbt Size from PeiGetSectionFromAnyFv is 0x%x\n", Size)); #if FixedPcdGet8(PcdFspModeSelection) == 1 FspsUpd->FspsConfig.GraphicsConfigPtr = (UINT32)(UINTN)Buffer; #else GtConfig->GraphicsConfigPtr = Buffer; #endif Size = 0; Buffer = NULL; PeiGetSectionFromAnyFv(&gTianoLogoGuid, EFI_SECTION_RAW, 0, &Buffer, &Size); DEBUG((DEBUG_INFO, "LogoPtr from PeiGetSectionFromAnyFv is 0x%x\n", Buffer)); DEBUG((DEBUG_INFO, "LogoSize from PeiGetSectionFromAnyFv is 0x%x\n", Size)); #if FixedPcdGet8(PcdFspModeSelection) == 1 FspsUpd->FspsConfig.LogoPtr = (UINT32)Buffer; FspsUpd->FspsConfig.LogoSize = Size; #else GtConfig->LogoPtr = Buffer; GtConfig->LogoSize = Size; #endif if (Buffer != NULL) { Blt = NULL; Status = TranslateBmpToGopBlt ( Buffer, Size, &Blt, &BltSize, &Height, &Width ); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "TranslateBmpToGopBlt, Status = %r\n", Status)); ASSERT_EFI_ERROR (Status); return Status; } UPDATE_POLICY(FspsUpd->FspsConfig.BltBufferSize, GtConfig->BltBufferSize, BltSize); UPDATE_POLICY(FspsUpd->FspsConfig.LogoPixelWidth, GtConfig->LogoPixelWidth, Width); UPDATE_POLICY(FspsUpd->FspsConfig.LogoPixelHeight, GtConfig->LogoPixelHeight, Height); #if FixedPcdGet8(PcdFspModeSelection) == 1 FspsUpd->FspsConfig.BltBufferAddress = (UINT32) Blt; #else GtConfig->BltBufferAddress = (VOID *) Blt; #endif } return EFI_SUCCESS; } /** Performs FSP SA PEI Policy initialization. @param[in][out] FspsUpd Pointer to FSP UPD Data. @retval EFI_SUCCESS FSP UPD Data is updated. @retval EFI_NOT_FOUND Fail to locate required PPI. @retval Other FSP UPD Data update process fail. **/ EFI_STATUS EFIAPI PeiFspSaPolicyInit ( IN OUT FSPS_UPD *FspsUpd ) { #if FixedPcdGet8(PcdFspModeSelection) == 0 EFI_STATUS Status; SI_POLICY_PPI *SiPolicyPpi; #endif SA_MISC_PEI_CONFIG *MiscPeiConfig; GRAPHICS_PEI_CONFIG *GtConfig; MiscPeiConfig = NULL; GtConfig = NULL; #if FixedPcdGet8(PcdFspModeSelection) == 0 // // Locate SiPolicyPpi // SiPolicyPpi = NULL; Status = PeiServicesLocatePpi( &gSiPolicyPpiGuid, 0, NULL, (VOID **)&SiPolicyPpi ); if ((Status == EFI_SUCCESS) && (SiPolicyPpi != NULL)) { MiscPeiConfig = NULL; Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSaMiscPeiConfigGuid, (VOID *) &MiscPeiConfig); ASSERT_EFI_ERROR (Status); GtConfig = NULL; Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gGraphicsPeiConfigGuid, (VOID *) &GtConfig); ASSERT_EFI_ERROR (Status); } #endif DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Wrapper UpdatePeiSaPolicy\n")); // // Update UPD: VBT & LogoPtr // UpdateGraphics(FspsUpd, GtConfig); return EFI_SUCCESS; }