alder_lake_bios/Insyde/InsydeModulePkg/Universal/Console/EdidOverrideDxe/EdidOverrideDxe.c

124 lines
4.0 KiB
C

/** @file
This driver provides optionally protocol to override or provide EDID
information and/or output device display properties to the producer
of the Graphics Output protocol.
;******************************************************************************
;* Copyright (c) 2013 - 2019, 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 "EdidOverrideDxe.h"
EFI_STATUS
EFIAPI
GetEdid (
IN EFI_EDID_OVERRIDE_PROTOCOL *This,
IN EFI_HANDLE *ChildHandle,
OUT UINT32 *Attributes,
IN OUT UINTN *EdidSize,
IN OUT UINT8 **Edid
);
EFI_EDID_OVERRIDE_PROTOCOL mEdidOverrideProtocolTemplate = { GetEdid };
EFI_STATUS
EFIAPI
EdidOverrideEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_HANDLE EdidOverrideHandle;
EdidOverrideHandle = NULL;
Status = gBS->InstallMultipleProtocolInterfaces (
&EdidOverrideHandle,
&gEfiEdidOverrideProtocolGuid,
&mEdidOverrideProtocolTemplate,
NULL
);
ASSERT_EFI_ERROR (Status);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
GetEdid (
IN EFI_EDID_OVERRIDE_PROTOCOL *This,
IN EFI_HANDLE *ChildHandle,
OUT UINT32 *Attributes,
IN OUT UINTN *EdidSize,
IN OUT UINT8 **Edid
)
{
EFI_STATUS Status;
EFI_STATUS EdidOverrideStatus;
OEM_GET_EDID_OVERRIDE_DEFINITION GetEdidOverride;
EFI_DEVICE_PATH_PROTOCOL *ChildDevPath;
EFI_DEVICE_PATH_PROTOCOL *SelectedVideoPortPath;
EFI_EDID_OVERRIDE_PROTOCOL *EdidOverride;
UINTN Size;
EdidOverrideStatus = EFI_UNSUPPORTED;
Status = gBS->HandleProtocol (
*ChildHandle,
&gEfiDevicePathProtocolGuid,
(VOID*)&ChildDevPath
);
if (EFI_ERROR (Status)) {
goto Done;
}
ZeroMem (&GetEdidOverride, sizeof(GetEdidOverride));
if ((*Edid != NULL) && (*EdidSize != 0)) {
GetEdidOverride.EdidSize = *EdidSize;
GetEdidOverride.EdidData = *Edid;
}
DEBUG_OEM_SVC ((DEBUG_INFO, "OemKernelServices Call: OemSvcGetEdidOverride \n"));
Status = OemSvcGetEdidOverride (&GetEdidOverride);
DEBUG_OEM_SVC ((DEBUG_INFO, "OemKernelServices OemSvcGetEdidOverride Status: %r\n", Status));
if (EFI_ERROR (Status) && Status != EFI_MEDIA_CHANGED) {
goto Done;
}
if ((GetEdidOverride.EdidSize != 0)) {
//
// return edid override for only a single child port
//
SelectedVideoPortPath = GetNextDevicePathInstance (&GetEdidOverride.DisplayDevPath, &Size);
if (CompareMem (SelectedVideoPortPath, ChildDevPath, Size) == 0) {
*Attributes = GetEdidOverride.Attributes;
*EdidSize = GetEdidOverride.EdidSize;
*Edid = GetEdidOverride.EdidData;
Status = gBS->HandleProtocol (
*ChildHandle,
&gEfiEdidOverrideProtocolGuid,
(VOID*)&EdidOverride
);
if (EFI_ERROR (Status)) {
Status = gBS->InstallMultipleProtocolInterfaces (
ChildHandle,
&gEfiEdidOverrideProtocolGuid,
&mEdidOverrideProtocolTemplate,
NULL
);
}
EdidOverrideStatus = EFI_SUCCESS;
}
}
Done:
return EdidOverrideStatus;
}