/** @file
DXE Library for Initializing SystemAgent Graphics ACPI table initialization.
Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
typedef union {
struct {
UINT32 Low;
UINT32 High;
} Data32;
UINT64 Data;
} UINT64_STRUCT;
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_STATUS Status;
GRAPHICS_DXE_CONFIG *GraphicsDxeConfig;
SA_POLICY_PROTOCOL *SaPolicy;
///
/// Get the platform setup policy.
///
DriverVersion = NULL;
Status = gBS->LocateProtocol (&gSaPolicyProtocolGuid, NULL, (VOID **) &SaPolicy);
ASSERT_EFI_ERROR (Status);
Status = GetConfigBlock ((VOID *) SaPolicy, &gGraphicsDxeConfigGuid, (VOID *)&GraphicsDxeConfig);
ASSERT_EFI_ERROR (Status);
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;
SYSTEM_AGENT_NVS_AREA_PROTOCOL *SaNvsAreaProtocol;
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);
///
/// Locate the SA Global NVS Protocol.
///
Status = gBS->LocateProtocol (&gSaNvsAreaProtocolGuid, NULL, (VOID **) &SaNvsAreaProtocol);
ASSERT_EFI_ERROR (Status);
///
/// Update IGD SA Global NVS
///
DEBUG ((DEBUG_INFO, " Update Igd SA Global NVS Area.\n"));
SaNvsAreaProtocol->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) {
SaNvsAreaProtocol->Area->IgdState = 1;
} else {
SaNvsAreaProtocol->Area->IgdState = 0;
}
SaNvsAreaProtocol->Area->BrightnessPercentage = 100;
SaNvsAreaProtocol->Area->IgdBootType = GraphicsDxeConfig->IgdBootType;
SaNvsAreaProtocol->Area->IgdPanelType = GraphicsDxeConfig->IgdPanelType;
SaNvsAreaProtocol->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.
///
SaNvsAreaProtocol->Area->IgdDvmtMemSize = GraphicsDxeConfig->IgdDvmtMemSize;
SaNvsAreaProtocol->Area->IgdFunc1Enable = 0;
SaNvsAreaProtocol->Area->IgdHpllVco = MmioRead8 (mMchBarBase.Data + 0xC0F) & 0x07;
SaNvsAreaProtocol->Area->IgdSciSmiMode = 0;
SaNvsAreaProtocol->Area->GfxTurboIMON = GraphicsDxeConfig->GfxTurboIMON;
SaNvsAreaProtocol->Area->EdpValid = 0;
return EFI_SUCCESS;
}