402 lines
12 KiB
C
402 lines
12 KiB
C
/** @file
|
|
|
|
;******************************************************************************
|
|
;* Copyright (c) 2014 - 2020, Insyde Software Corp. All Rights Reserved.
|
|
;*
|
|
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
|
|
;* transmit, broadcast, present, recite, release, license or otherwise exploit
|
|
;* any part of this publication in any form, by any means, without the prior
|
|
;* written permission of Insyde Software Corporation.
|
|
;*
|
|
;******************************************************************************
|
|
*/
|
|
|
|
#include <GopPolicy.h>
|
|
#include <Library/BaseOemSvcChipsetLib.h>
|
|
#include <Library/DxeInsydeChipsetLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/EcMiscLib.h>
|
|
|
|
extern EFI_GUID gGopOverrideProtocolGuid;
|
|
|
|
//
|
|
// Function implementations
|
|
//
|
|
|
|
/**
|
|
|
|
@param[out] CurrentLidStatus
|
|
|
|
@retval EFI_SUCCESS
|
|
@retval EFI_UNSUPPORTED
|
|
**/
|
|
EFI_STATUS
|
|
GetPlatformLidStatus (
|
|
OUT LID_STATUS *CurrentLidStatus
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
EFI_STATUS EcGetLidState;
|
|
BOOLEAN LidIsOpen;
|
|
|
|
EcGetLidState = EFI_SUCCESS;
|
|
LidIsOpen = TRUE;
|
|
Status = EFI_UNSUPPORTED;
|
|
|
|
DEBUG_OEM_SVC ((DEBUG_INFO, "Base OemChipsetServices Call: OemSvcEcGetLidState \n"));
|
|
Status = OemSvcEcGetLidState (&EcGetLidState, &LidIsOpen);
|
|
DEBUG_OEM_SVC ((DEBUG_INFO, "Base OemChipsetServices OemSvcEcGetLidState Status: %r\n", Status));
|
|
ASSERT (!EFI_ERROR (EcGetLidState));
|
|
if (Status == EFI_MEDIA_CHANGED) {
|
|
//
|
|
// return Lid supported to GOP, because Lid state has checked in OemService.
|
|
//
|
|
Status = EFI_SUCCESS;
|
|
}
|
|
|
|
*CurrentLidStatus = LidOpen;
|
|
if (!EFI_ERROR (EcGetLidState)) {
|
|
if (!LidIsOpen) {
|
|
//
|
|
// If get lid state form EC successfully and lid is closed.
|
|
//
|
|
*CurrentLidStatus = LidClosed;
|
|
}
|
|
} else {
|
|
DEBUG ((DEBUG_INFO | DEBUG_ERROR, "EcGetLidState ERROR in GopPolicy! Status is %r.\n", EcGetLidState));
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
|
|
@param[out] CurrentDockStatus
|
|
|
|
@retval EFI_SUCCESS
|
|
@retval EFI_UNSUPPORTED
|
|
**/
|
|
EFI_STATUS
|
|
GetPlatformDockStatus (
|
|
OUT DOCK_STATUS *CurrentDockStatus
|
|
)
|
|
{
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
/**
|
|
|
|
@param[out] VbtAddress
|
|
@param[out] VbtSize
|
|
|
|
@retval EFI_SUCCESS
|
|
@retval EFI_NOT_FOUND
|
|
**/
|
|
EFI_STATUS
|
|
GetVbtData (
|
|
OUT EFI_PHYSICAL_ADDRESS *VbtAddress,
|
|
OUT UINT32 *VbtSize
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
EFI_HANDLE *HandleBuffer;
|
|
UINTN NumberOfHandles;
|
|
UINT32 FvStatus;
|
|
UINTN Index;
|
|
EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol = NULL;
|
|
VOID *VbtSectionPtr = NULL;
|
|
UINTN VbtSectionSize = 0;
|
|
// UINT8 FabId;
|
|
UINT8 BoardId;
|
|
EFI_GUID *InsydeVbtFileGuid;
|
|
EFI_BOOT_MODE BootMode;
|
|
|
|
Status = EFI_SUCCESS;
|
|
InsydeVbtFileGuid = NULL;
|
|
//
|
|
// Locate FV protocol.
|
|
// There is little chance we can't find an FV protocol
|
|
//
|
|
Status = gBS->LocateHandleBuffer (
|
|
ByProtocol,
|
|
&gEfiFirmwareVolume2ProtocolGuid,
|
|
NULL,
|
|
&NumberOfHandles,
|
|
&HandleBuffer
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
DEBUG ((DEBUG_ERROR, "NumberOfHandles: 0x%X\n", NumberOfHandles));
|
|
ASSERT((NumberOfHandles != 0));
|
|
BoardId = (UINT8)PcdGet64 (PcdH2OBoardId);
|
|
BoardId &= 0x01F;
|
|
BootMode = GetBootModeHob ();
|
|
|
|
// switch (BoardId) {
|
|
// case BoardIdSkylakeA0Rvp3:
|
|
// case BoardIdSkylakeURvp7:
|
|
//// if (BootMode != BOOT_IN_RECOVERY_MODE) {
|
|
// InsydeVbtFileGuid = &gVbtRvp3Rvp7FileGuid;
|
|
//// } else {
|
|
//// InsydeVbtFileGuid = &gGop1021VbtRvp3Rvp7FileGuid;
|
|
//// }
|
|
// break;
|
|
// case BoardIdSkylakeAioRvp10Crb:
|
|
//// if (BootMode != BOOT_IN_RECOVERY_MODE) {
|
|
// InsydeVbtFileGuid = &gVbtRvp10FileGuid;
|
|
//// } else {
|
|
//// InsydeVbtFileGuid = &gGop1021VbtRvp10FileGuid;
|
|
//// }
|
|
// break;
|
|
// case BoardIdSkylakeHaloDdr4Rvp11:
|
|
// InsydeVbtFileGuid = &gVbtRvp11FileGuid;
|
|
// break;
|
|
// case BoardIdSkylakeDtRvp8Crb:
|
|
//// if (BootMode != BOOT_IN_RECOVERY_MODE) {
|
|
// InsydeVbtFileGuid = &gVbtRvp8FileGuid;
|
|
//// } else {
|
|
//// InsydeVbtFileGuid = &gGop1021VbtRvp8FileGuid;
|
|
//// }
|
|
// break;
|
|
////
|
|
//// if other BoardId is as same as ApacFakeBoardId but Apac is disable, current setting follow default.
|
|
////
|
|
// case ApacFakeBoardId: // Board ID = 0xFE
|
|
// if (FeaturePcdGet(PcdApacSupport)) {
|
|
// InsydeVbtFileGuid = &gVbtRvp10FileGuid;
|
|
// } else {
|
|
// InsydeVbtFileGuid = &gVbtRvp3Rvp7FileGuid;
|
|
// }
|
|
// break;
|
|
|
|
// default:
|
|
// InsydeVbtFileGuid = &gVbtRvpFileGuid;
|
|
// break;
|
|
// }
|
|
// }
|
|
InsydeVbtFileGuid = PcdGetPtr (PcdIntelGraphicsVbtFileGuid);
|
|
|
|
//
|
|
// Looking for FV with VBT storage file
|
|
//
|
|
for (Index = 0; Index < NumberOfHandles; Index++) {
|
|
//
|
|
// Get the protocol on this handle
|
|
// This should not fail because of LocateHandleBuffer
|
|
//
|
|
Status = gBS->HandleProtocol (
|
|
HandleBuffer[Index],
|
|
&gEfiFirmwareVolume2ProtocolGuid,
|
|
(VOID**)&FwVol
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
//
|
|
// See if it has the VBT storage file
|
|
//
|
|
VbtSectionSize = 0;
|
|
FvStatus = 0;
|
|
VbtSectionPtr = NULL; //ask ReadFile to allocate
|
|
|
|
Status = FwVol->ReadSection (
|
|
FwVol,
|
|
InsydeVbtFileGuid,
|
|
EFI_SECTION_RAW,
|
|
0,
|
|
(VOID **) &VbtSectionPtr,
|
|
&VbtSectionSize,
|
|
&FvStatus
|
|
);
|
|
|
|
//
|
|
// If we found it, then we are done
|
|
//
|
|
if (!EFI_ERROR (Status)) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Free any allocated buffers
|
|
//
|
|
(gBS->FreePool) (HandleBuffer);
|
|
|
|
*VbtAddress = (EFI_PHYSICAL_ADDRESS) VbtSectionPtr;
|
|
*VbtSize = (UINT32) VbtSectionSize;
|
|
|
|
VBTPlatformHook (VbtAddress, VbtSize);
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
Entry point for the GOP Policy Driver.
|
|
|
|
@param[in] ImageHandle Image handle of this driver.
|
|
@param[in] SystemTable Global system service table.
|
|
|
|
@retval EFI_SUCCESS Initialization complete.
|
|
@retval EFI_OUT_OF_RESOURCES Do not have enough resources to initialize the driver.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
GopPolicyEntry (
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
)
|
|
{
|
|
GOP_POLICY_PROTOCOL *PlatformGopPolicyPtr = NULL;
|
|
EFI_STATUS Status;
|
|
EFI_BOOT_MODE BootMode;
|
|
EFI_HANDLE Handle;
|
|
// UINT8 FabId;
|
|
DEBUG ((DEBUG_INFO | DEBUG_ERROR, "\nGop Policy Entry\n"));
|
|
|
|
PlatformGopPolicyPtr = AllocateZeroPool (sizeof (GOP_POLICY_PROTOCOL));
|
|
if (PlatformGopPolicyPtr == NULL) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
PlatformGopPolicyPtr->Revision = GOP_POLICY_PROTOCOL_REVISION_03;
|
|
PlatformGopPolicyPtr->GetPlatformLidStatus = GetPlatformLidStatus;
|
|
PlatformGopPolicyPtr->GetVbtData = GetVbtData;
|
|
PlatformGopPolicyPtr->GetPlatformDockStatus = GetPlatformDockStatus;
|
|
|
|
//[-start-201227-IB16740000-remove]// GopOverrideDriver has removed in RC1515.01
|
|
// if (PcdGetBool(PcdGopOverrideDriverEnable)) {
|
|
// CopyGuid(&PlatformGopPolicyPtr->GopOverrideGuid, &gGopOverrideProtocolGuid);
|
|
// DEBUG ((DEBUG_INFO, "DxeGopOverride Enabled\n"));
|
|
// } else {
|
|
// DEBUG ((DEBUG_INFO, "DxeGopOverride Disabled\n"));
|
|
// }
|
|
//[-end-201227-IB16740000-remove]//
|
|
|
|
//
|
|
// OemServices
|
|
//
|
|
|
|
Status = gBS->InstallProtocolInterface (
|
|
&ImageHandle,
|
|
&gGopPolicyProtocolGuid,
|
|
EFI_NATIVE_INTERFACE,
|
|
PlatformGopPolicyPtr
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
BootMode = GetBootModeHob ();
|
|
Handle = NULL;
|
|
// if (BootMode == BOOT_IN_RECOVERY_MODE) {
|
|
// if (BoardId != BoardIdSkylakeHaloDdr4Rvp11) {
|
|
// Status = gBS->InstallProtocolInterface (
|
|
// &Handle,
|
|
// &gCrisisGopGuid,
|
|
// EFI_NATIVE_INTERFACE,
|
|
// NULL
|
|
// );
|
|
// } else {
|
|
Status = gBS->InstallProtocolInterface (
|
|
&Handle,
|
|
&gGopGuid,
|
|
EFI_NATIVE_INTERFACE,
|
|
NULL
|
|
);
|
|
// }
|
|
// ASSERT_EFI_ERROR (Status);
|
|
// } else {
|
|
// Status = gBS->InstallProtocolInterface (
|
|
// &Handle,
|
|
// &gGopGuid,
|
|
// EFI_NATIVE_INTERFACE,
|
|
// NULL
|
|
// );
|
|
// ASSERT_EFI_ERROR (Status);
|
|
// }
|
|
|
|
DEBUG ( ( DEBUG_INFO | DEBUG_ERROR, "Gop Policy exit\n" ) );
|
|
return Status;
|
|
}
|
|
|
|
EFI_STATUS
|
|
VBTPlatformHook (
|
|
IN OUT EFI_PHYSICAL_ADDRESS *VBTAddress,
|
|
IN OUT UINT32 *VBTSize
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
// UINTN VariableSize;
|
|
CHIPSET_CONFIGURATION SystemConfiguration;
|
|
// EFI_GUID SystemConfigurationGuid = SYSTEM_CONFIGURATION_GUID;
|
|
UINTN SetupSize;
|
|
SA_SETUP *SaSetup;
|
|
UINT8 IgdLcdBlc;
|
|
|
|
// VariableSize = 0;
|
|
// VariableSize = PcdGet32 (PcdSetupConfigSize);
|
|
// Status = gRT->GetVariable (
|
|
// L"Setup",
|
|
// &SystemConfigurationGuid,
|
|
// NULL,
|
|
// &VariableSize,
|
|
// &SystemConfiguration
|
|
// );
|
|
// ASSERT_EFI_ERROR (Status);
|
|
Status = GetChipsetSetupVariableDxe (&SystemConfiguration, sizeof (CHIPSET_CONFIGURATION));
|
|
if (EFI_ERROR (Status)) {
|
|
ASSERT_EFI_ERROR (Status);
|
|
return Status;
|
|
}
|
|
|
|
SetupSize = sizeof (SA_SETUP);
|
|
SaSetup = AllocateZeroPool (SetupSize);
|
|
if (SaSetup == NULL) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
Status = gRT->GetVariable (
|
|
SA_SETUP_VARIABLE_NAME,
|
|
&gSaSetupVariableGuid,
|
|
NULL,
|
|
&SetupSize,
|
|
SaSetup
|
|
);
|
|
if (EFI_ERROR (Status)) {
|
|
FreePool (SaSetup);
|
|
return Status;
|
|
} else {
|
|
IgdLcdBlc = SaSetup->IgdLcdBlc;
|
|
}
|
|
|
|
if (SaSetup->ActiveLFP == 0x03) {
|
|
//
|
|
// Update Active LFP Setting
|
|
//
|
|
VBT8AndThenOr (*VBTAddress, R_VBT_LFP_CONFIG, (~B_VBT_LFP_CONFIG), (V_VBT_LFP_CONFIG_eDP << N_VBT_LFP_CONFIG));
|
|
}
|
|
FreePool (SaSetup);
|
|
|
|
switch (IgdLcdBlc) {
|
|
case 0x00:
|
|
VBT8AndThenOr (*VBTAddress, R_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE, (~B_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE ), ( V_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE_PWM << N_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE));
|
|
VBT8AndThenOr (*VBTAddress, R_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY, (~B_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY ), ( V_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY_INVERTED << N_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY));
|
|
break;
|
|
|
|
case 0x01:
|
|
VBT8AndThenOr (*VBTAddress, R_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE, (~B_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE ), ( V_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE_I2C << N_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE));
|
|
VBT8AndThenOr (*VBTAddress, R_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY, (~B_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY ), ( V_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY_INVERTED << N_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY));
|
|
break;
|
|
|
|
case 0x02:
|
|
VBT8AndThenOr (*VBTAddress, R_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE, (~B_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE ), ( V_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE_PWM << N_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE));
|
|
VBT8AndThenOr (*VBTAddress, R_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY, (~B_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY ), ( V_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY_NORMAL << N_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY));
|
|
break;
|
|
|
|
case 0x03:
|
|
VBT8AndThenOr (*VBTAddress, R_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE, (~B_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE ), ( V_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE_I2C << N_VBT_BACKLIGHT_CONTROL_INVERTER_TYPE));
|
|
VBT8AndThenOr (*VBTAddress, R_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY, (~B_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY ), ( V_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY_NORMAL << N_VBT_BACKLIGHT_CONTROL_INVERTER_POLARITY));
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
return Status;
|
|
}
|