/** @file DXE driver for Initializing SystemAgent Graphics ACPI table initialization. Copyright (c) 2019 - 2020 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "GraphicsInit.h" #include "SaInit.h" #include #include #include #include typedef union { struct { UINT32 Low; UINT32 High; } Data32; UINT64 Data; } UINT64_STRUCT; extern SYSTEM_AGENT_NVS_AREA_PROTOCOL mSaNvsAreaProtocol; GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mGttMmAdr; GLOBAL_REMOVE_IF_UNREFERENCED UINT64_STRUCT mMchBarBase; GLOBAL_REMOVE_IF_UNREFERENCED GOP_COMPONENT_NAME2_PROTOCOL *GopComponentName2Protocol = NULL; /** Do Post GT PM Init Steps after VBIOS Initialization. @retval EFI_SUCCESS Succeed. **/ EFI_STATUS PostPmInitEndOfDxe ( VOID ) { CHAR16 *DriverVersion; UINTN Index; EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; EFI_STATUS Status; GRAPHICS_DXE_CONFIG *GraphicsDxeConfig; EFI_PEI_HOB_POINTERS HobPtr; SI_CONFIG_HOB_DATA *SiConfigHobData; /// /// Get the platform setup policy. /// DriverVersion = NULL; LegacyBios = NULL; Status = gBS->LocateProtocol (&gSaPolicyProtocolGuid, NULL, (VOID **) &mSaPolicy); ASSERT_EFI_ERROR (Status); Status = GetConfigBlock ((VOID *) mSaPolicy, &gGraphicsDxeConfigGuid, (VOID *)&GraphicsDxeConfig); ASSERT_EFI_ERROR (Status); // // Get Silicon Config data HOB // HobPtr.Guid = GetFirstGuidHob (&gSiConfigHobGuid); SiConfigHobData = (SI_CONFIG_HOB_DATA *)GET_GUID_HOB_DATA (HobPtr.Guid); if (SiConfigHobData->CsmFlag == 1) { Status = gBS->LocateProtocol ( &gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios ); } if (LegacyBios == NULL) { Status = gBS->LocateProtocol (&gGopComponentName2ProtocolGuid, NULL, (VOID **)&GopComponentName2Protocol); if (!EFI_ERROR (Status)) { Status = GopComponentName2Protocol->GetDriverVersion ( GopComponentName2Protocol, "en-US", &DriverVersion ); if (!EFI_ERROR (Status)) { for (Index = 0; (DriverVersion[Index] != '\0'); Index++) { } Index = (Index+1)*2; CopyMem (GraphicsDxeConfig->GopVersion, DriverVersion, Index); } } } /// /// Return final status /// return EFI_SUCCESS; } /** Initialize GT ACPI tables @param[in] ImageHandle - Handle for the image of this driver @param[in] SaPolicy - SA DXE Policy protocol @retval EFI_SUCCESS - GT ACPI initialization complete @retval EFI_NOT_FOUND - Dxe System Table not found. @retval EFI_OUT_OF_RESOURCES - Mmio not allocated successfully. **/ EFI_STATUS GraphicsInit ( IN EFI_HANDLE ImageHandle, IN SA_POLICY_PROTOCOL *SaPolicy ) { EFI_STATUS Status; GRAPHICS_DXE_CONFIG *GraphicsDxeConfig; mGttMmAdr = 0; Status = EFI_SUCCESS; mMchBarBase.Data32.High = PciSegmentRead32 (PCI_SEGMENT_LIB_ADDRESS (SA_SEG_NUM, SA_MC_BUS, 0, 0, R_SA_MCHBAR + 4)); mMchBarBase.Data32.Low = PciSegmentRead32 (PCI_SEGMENT_LIB_ADDRESS (SA_SEG_NUM, SA_MC_BUS, 0, 0, R_SA_MCHBAR)); mMchBarBase.Data &= (UINT64) ~BIT0; Status = GetConfigBlock ((VOID *) SaPolicy, &gGraphicsDxeConfigGuid, (VOID *)&GraphicsDxeConfig); ASSERT_EFI_ERROR (Status); /// /// Update IGD SA Global NVS /// DEBUG ((DEBUG_INFO, " Update Igd SA Global NVS Area.\n")); mSaNvsAreaProtocol.Area->AlsEnable = GraphicsDxeConfig->AlsEnable; /// /// Initialize IGD state by checking if IGD Device 2 Function 0 is enabled in the chipset /// if (PciSegmentRead16 (PCI_SEGMENT_LIB_ADDRESS (SA_SEG_NUM, SA_MC_BUS, 0, 0, R_SA_DEVEN)) & B_SA_DEVEN_D2EN_MASK) { mSaNvsAreaProtocol.Area->IgdState = 1; } else { mSaNvsAreaProtocol.Area->IgdState = 0; } mSaNvsAreaProtocol.Area->BrightnessPercentage = 100; mSaNvsAreaProtocol.Area->IgdBootType = GraphicsDxeConfig->IgdBootType; mSaNvsAreaProtocol.Area->IgdPanelType = GraphicsDxeConfig->IgdPanelType; mSaNvsAreaProtocol.Area->IgdPanelScaling = GraphicsDxeConfig->IgdPanelScaling; /// /// Get SFF power mode platform data for the IGD driver. Flip the bit (bitwise xor) /// since Setup value is opposite of NVS and IGD OpRegion value. /// mSaNvsAreaProtocol.Area->IgdDvmtMemSize = GraphicsDxeConfig->IgdDvmtMemSize; mSaNvsAreaProtocol.Area->IgdFunc1Enable = 0; mSaNvsAreaProtocol.Area->IgdHpllVco = MmioRead8 (mMchBarBase.Data + 0xC0F) & 0x07; mSaNvsAreaProtocol.Area->IgdSciSmiMode = 0; mSaNvsAreaProtocol.Area->GfxTurboIMON = GraphicsDxeConfig->GfxTurboIMON; mSaNvsAreaProtocol.Area->EdpValid = 0; return EFI_SUCCESS; }