/** @file
This file initialises and Installs GopPolicy Protocol.
Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "GopPolicyInitDxe.h"
#include
GLOBAL_REMOVE_IF_UNREFERENCED GOP_POLICY_PROTOCOL mGOPPolicy;
GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mVbtSize = 0;
GLOBAL_REMOVE_IF_UNREFERENCED EFI_PHYSICAL_ADDRESS mVbtAddress = 0;
//
// Function implementations
//
/**
@param[out] CurrentLidStatus
@retval EFI_SUCCESS
@retval EFI_UNSUPPORTED
**/
EFI_STATUS
EFIAPI
GetPlatformLidStatus (
OUT LID_STATUS *CurrentLidStatus
)
{
return EFI_UNSUPPORTED;
}
/**
@param[out] CurrentDockStatus
@retval EFI_SUCCESS
@retval EFI_UNSUPPORTED
**/
EFI_STATUS
EFIAPI
GetPlatformDockStatus (
OUT DOCK_STATUS CurrentDockStatus
)
{
return EFI_UNSUPPORTED;
}
/**
@param[out] VbtAddress
@param[out] VbtSize
@retval EFI_SUCCESS
@retval EFI_NOT_FOUND
**/
EFI_STATUS
EFIAPI
GetVbtData (
OUT EFI_PHYSICAL_ADDRESS *VbtAddress,
OUT UINT32 *VbtSize
)
{
EFI_STATUS Status;
UINTN FvProtocolCount;
EFI_HANDLE *FvHandles;
EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
UINTN Index;
UINT32 AuthenticationStatus;
UINT8 *Buffer;
UINTN VbtBufferSize;
Status = EFI_NOT_FOUND;
if ( mVbtAddress == 0) {
Fv = NULL;
Buffer = 0;
FvHandles = NULL;
Status = gBS->LocateHandleBuffer (
ByProtocol,
&gEfiFirmwareVolume2ProtocolGuid,
NULL,
&FvProtocolCount,
&FvHandles
);
if (!EFI_ERROR (Status)) {
for (Index = 0; Index < FvProtocolCount; Index++) {
Status = gBS->HandleProtocol (
FvHandles[Index],
&gEfiFirmwareVolume2ProtocolGuid,
(VOID **) &Fv
);
VbtBufferSize = 0;
Status = Fv->ReadSection (
Fv,
PcdGetPtr(PcdIntelGraphicsVbtFileGuid),
EFI_SECTION_RAW,
0,
(VOID **) &Buffer,
&VbtBufferSize,
&AuthenticationStatus
);
if (!EFI_ERROR (Status)) {
*VbtAddress = (EFI_PHYSICAL_ADDRESS)Buffer;
*VbtSize = (UINT32)VbtBufferSize;
mVbtAddress = *VbtAddress;
mVbtSize = *VbtSize;
Status = EFI_SUCCESS;
break;
}
}
} else {
Status = EFI_NOT_FOUND;
}
if (FvHandles != NULL) {
FreePool (FvHandles);
FvHandles = NULL;
}
} else {
*VbtAddress = mVbtAddress;
*VbtSize = mVbtSize;
Status = EFI_SUCCESS;
}
return Status;
}
/**
Initialize GOP DXE Policy
@param[in] ImageHandle Image handle of this driver.
@retval EFI_SUCCESS Initialization complete.
@retval EFI_UNSUPPORTED The chipset is unsupported by this driver.
@retval EFI_OUT_OF_RESOURCES Do not have enough resources to initialize the driver.
@retval EFI_DEVICE_ERROR Device error, driver exits abnormally.
**/
EFI_STATUS
EFIAPI
GopPolicyInitDxe (
IN EFI_HANDLE ImageHandle
)
{
EFI_STATUS Status;
//
// Initialize the EFI Driver Library
//
SetMem (&mGOPPolicy, sizeof (GOP_POLICY_PROTOCOL), 0);
mGOPPolicy.Revision = GOP_POLICY_PROTOCOL_REVISION_03;
mGOPPolicy.GetPlatformLidStatus = GetPlatformLidStatus;
mGOPPolicy.GetVbtData = GetVbtData;
mGOPPolicy.GetPlatformDockStatus = GetPlatformDockStatus;
//
// Install protocol to allow access to this Policy.
//
Status = gBS->InstallMultipleProtocolInterfaces (
&ImageHandle,
&gGopPolicyProtocolGuid,
&mGOPPolicy,
NULL
);
return Status;
}