124 lines
4.0 KiB
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;
|
|
}
|