/** @file This file provide services for DXE phase policy default initialization Copyright (c) 2017 - 2020 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "DxeSaPolicyLibrary.h" #include extern EFI_GUID gGraphicsDxeConfigGuid; extern EFI_GUID gMiscDxeConfigGuid; /** This function prints the SA DXE phase policy. @param[in] SaPolicy - SA DXE Policy protocol **/ VOID SaPrintPolicyProtocol ( IN SA_POLICY_PROTOCOL *SaPolicy ) { EFI_STATUS Status; GRAPHICS_DXE_CONFIG *GraphicsDxeConfig; MISC_DXE_CONFIG *MiscDxeConfig; // // Get requisite IP Config Blocks which needs to be used here // Status = GetConfigBlock ((VOID *) SaPolicy, &gGraphicsDxeConfigGuid, (VOID *)&GraphicsDxeConfig); ASSERT_EFI_ERROR (Status); Status = GetConfigBlock ((VOID *) SaPolicy, &gMiscDxeConfigGuid, (VOID *)&MiscDxeConfig); ASSERT_EFI_ERROR (Status); DEBUG_CODE_BEGIN (); DEBUG ((DEBUG_INFO, "\n------------------------ SA Policy (DXE) print BEGIN -----------------\n")); DEBUG ((DEBUG_INFO, "Revision : %x\n", SaPolicy->TableHeader.Header.Revision)); ASSERT (SaPolicy->TableHeader.Header.Revision >= SA_POLICY_PROTOCOL_REVISION); DEBUG ((DEBUG_INFO, "------------------------ SA_MISC_CONFIGURATION -----------------\n")); DEBUG ((DEBUG_INFO, " EnableAbove4GBMmio : %x\n", MiscDxeConfig->EnableAbove4GBMmio)); DEBUG ((DEBUG_INFO, "\n------------------------ SA Policy (DXE) print END -----------------\n")); DEBUG_CODE_END (); return; } EFI_STATUS EFIAPI LoadIgdDxeDefault ( IN VOID *ConfigBlockPointer ) { GRAPHICS_DXE_CONFIG *GraphicsDxeConfig; GraphicsDxeConfig = ConfigBlockPointer; DEBUG ((DEBUG_INFO, "GraphicsDxeConfig->Header.GuidHob.Name = %g\n", &GraphicsDxeConfig->Header.GuidHob.Name)); DEBUG ((DEBUG_INFO, "GraphicsDxeConfig->Header.GuidHob.Header.HobLength = 0x%x\n", GraphicsDxeConfig->Header.GuidHob.Header.HobLength)); /// /// Initialize the Graphics configuration /// GraphicsDxeConfig->VbtAddress = 0x00000000; GraphicsDxeConfig->Size = 0; GraphicsDxeConfig->PlatformConfig = 1; GraphicsDxeConfig->AlsEnable = 2; GraphicsDxeConfig->BacklightControlSupport = 2; GraphicsDxeConfig->IgdBootType = 0; GraphicsDxeConfig->IgdPanelType = 0; GraphicsDxeConfig->IgdPanelScaling = 0; GraphicsDxeConfig->IgdBlcConfig = 2; GraphicsDxeConfig->LowPowerMode = 1; GraphicsDxeConfig->IgdDvmtMemSize = 1; GraphicsDxeConfig->GfxTurboIMON = 31; return EFI_SUCCESS; } EFI_STATUS EFIAPI LoadMiscDxeDefault ( IN VOID *ConfigBlockPointer ) { MISC_DXE_CONFIG *MiscDxeConfig; MiscDxeConfig = ConfigBlockPointer; DEBUG ((DEBUG_INFO, "MiscDxeConfig->Header.GuidHob.Name = %g\n", &MiscDxeConfig->Header.GuidHob.Name)); DEBUG ((DEBUG_INFO, "MiscDxeConfig->Header.GuidHob.Header.HobLength = 0x%x\n", MiscDxeConfig->Header.GuidHob.Header.HobLength)); /// /// RMRR Base and Limit Address for USB /// MiscDxeConfig->RmrrUsbBaseAddress = AllocateZeroPool (sizeof (EFI_PHYSICAL_ADDRESS) * 2); ASSERT (MiscDxeConfig->RmrrUsbBaseAddress != NULL); if (MiscDxeConfig->RmrrUsbBaseAddress != NULL) { /// /// BIOS must update USB RMRR base address /// MiscDxeConfig->RmrrUsbBaseAddress[0] = 0; MiscDxeConfig->RmrrUsbBaseAddress[1] = 0; } return EFI_SUCCESS; } /** LoadSaDxeConfigBlockDefault - Initialize default settings for each SA Config block @param[in] ConfigBlockPointer The buffer pointer that will be initialized as specific config block @param[in] BlockId Request to initialize defaults of specified config block by given Block ID @retval EFI_SUCCESS The given buffer has contained the defaults of requested config block @retval EFI_NOT_FOUND Block ID is not defined so no default Config block will be initialized **/ EFI_STATUS EFIAPI LoadSaDxeConfigBlockDefault ( IN VOID *ConfigBlockPointer, IN EFI_GUID BlockGuid ) { if (CompareGuid (&BlockGuid, &gGraphicsDxeConfigGuid)) { LoadIgdDxeDefault (ConfigBlockPointer); } else if (CompareGuid (&BlockGuid, &gMiscDxeConfigGuid)) { LoadMiscDxeDefault (ConfigBlockPointer); } else { return EFI_NOT_FOUND; } return EFI_SUCCESS; } /** CreateSaDxeConfigBlocks generates the config blocksg of SA DXE Policy. It allocates and zero out buffer, and fills in the Intel default settings. @param[out] SaPolicy The pointer to get SA DXE Protocol instance @retval EFI_SUCCESS The policy default is initialized. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer **/ EFI_STATUS EFIAPI CreateSaDxeConfigBlocks ( IN OUT SA_POLICY_PROTOCOL **SaPolicy ) { UINT16 TotalBlockSize; UINT16 TotalBlockCount; UINT16 BlockCount; VOID *ConfigBlockPointer; EFI_STATUS Status; SA_POLICY_PROTOCOL *SaInitPolicy; UINT16 RequiredSize; STATIC CONFIG_BLOCK_HEADER SklSaDxeIpBlocks [] = { {{{0, sizeof (GRAPHICS_DXE_CONFIG), 0}, {0}}, GRAPHICS_DXE_CONFIG_REVISION, 0, {0, 0}}, {{{0, sizeof (MISC_DXE_CONFIG), 0}, {0}}, MISC_DXE_CONFIG_REVISION, 0, {0, 0}} }; SaInitPolicy = NULL; TotalBlockCount = sizeof (SklSaDxeIpBlocks) / sizeof (CONFIG_BLOCK_HEADER); DEBUG ((DEBUG_INFO, "TotalBlockCount = 0x%x\n", TotalBlockCount)); TotalBlockSize = 0; for (BlockCount = 0 ; BlockCount < TotalBlockCount; BlockCount++) { TotalBlockSize += (UINT32) SklSaDxeIpBlocks[BlockCount].GuidHob.Header.HobLength; DEBUG ((DEBUG_INFO, "TotalBlockSize after adding Block[0x%x]= 0x%x\n", BlockCount, TotalBlockSize)); } RequiredSize = sizeof (CONFIG_BLOCK_TABLE_HEADER) + TotalBlockSize; Status = CreateConfigBlockTable (RequiredSize, (VOID *)&SaInitPolicy); ASSERT_EFI_ERROR (Status); // // Initalize SklSaIpBlocks table GUID // CopyMem (&SklSaDxeIpBlocks[0].GuidHob.Name, &gGraphicsDxeConfigGuid, sizeof (EFI_GUID)); CopyMem (&SklSaDxeIpBlocks[1].GuidHob.Name, &gMiscDxeConfigGuid, sizeof (EFI_GUID)); // // Initialize Policy Revision // SaInitPolicy->TableHeader.Header.Revision = SA_POLICY_PROTOCOL_REVISION; // // Initialize ConfigBlockPointer to NULL // ConfigBlockPointer = NULL; // // Loop to identify each config block from SklSaDxeIpBlocks[] Table and add each of them // for (BlockCount = 0 ; BlockCount < TotalBlockCount; BlockCount++) { ConfigBlockPointer = (VOID *)&SklSaDxeIpBlocks[BlockCount]; Status = AddConfigBlock ((VOID *) SaInitPolicy, (VOID *)&ConfigBlockPointer); ASSERT_EFI_ERROR (Status); LoadSaDxeConfigBlockDefault ((VOID *) ConfigBlockPointer, SklSaDxeIpBlocks[BlockCount].GuidHob.Name); } // // Assignment for returning SaPolicy config block base address // *SaPolicy = SaInitPolicy; return EFI_SUCCESS; } /** SaInstallPolicyProtocol installs SA Policy. While installed, RC assumes the Policy is ready and finalized. So please update and override any setting before calling this function. @param[in] ImageHandle Image handle of this driver. @param[in] SaPolicy The pointer to SA Policy Protocol instance @retval EFI_SUCCESS The policy is installed. @retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer **/ EFI_STATUS EFIAPI SaInstallPolicyProtocol ( IN EFI_HANDLE ImageHandle, IN SA_POLICY_PROTOCOL *SaPolicy ) { EFI_STATUS Status; /// /// Print SA DXE Policy /// SaPrintPolicyProtocol (SaPolicy); /// /// Install protocol to to allow access to this Policy. /// Status = gBS->InstallMultipleProtocolInterfaces ( &ImageHandle, &gSaPolicyProtocolGuid, SaPolicy, NULL ); ASSERT_EFI_ERROR (Status); return Status; }