154 lines
4.4 KiB
C
154 lines
4.4 KiB
C
|
/** @file
|
||
|
Logo DXE Driver, install Edkii Platform Logo protocol.
|
||
|
|
||
|
Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
#include <Uefi.h>
|
||
|
#include <Protocol/HiiDatabase.h>
|
||
|
#include <Protocol/GraphicsOutput.h>
|
||
|
#include <Protocol/HiiImageEx.h>
|
||
|
#include <Protocol/PlatformLogo.h>
|
||
|
#include <Protocol/HiiPackageList.h>
|
||
|
#include <Library/UefiBootServicesTableLib.h>
|
||
|
#include <Library/DebugLib.h>
|
||
|
|
||
|
typedef struct {
|
||
|
EFI_IMAGE_ID ImageId;
|
||
|
EDKII_PLATFORM_LOGO_DISPLAY_ATTRIBUTE Attribute;
|
||
|
INTN OffsetX;
|
||
|
INTN OffsetY;
|
||
|
} LOGO_ENTRY;
|
||
|
|
||
|
EFI_HII_IMAGE_EX_PROTOCOL *mHiiImageEx;
|
||
|
EFI_HII_HANDLE mHiiHandle;
|
||
|
LOGO_ENTRY mLogos[] = {
|
||
|
{
|
||
|
IMAGE_TOKEN (IMG_LOGO),
|
||
|
EdkiiPlatformLogoDisplayAttributeCenter,
|
||
|
0,
|
||
|
0
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
Load a platform logo image and return its data and attributes.
|
||
|
|
||
|
@param This The pointer to this protocol instance.
|
||
|
@param Instance The visible image instance is found.
|
||
|
@param Image Points to the image.
|
||
|
@param Attribute The display attributes of the image returned.
|
||
|
@param OffsetX The X offset of the image regarding the Attribute.
|
||
|
@param OffsetY The Y offset of the image regarding the Attribute.
|
||
|
|
||
|
@retval EFI_SUCCESS The image was fetched successfully.
|
||
|
@retval EFI_NOT_FOUND The specified image could not be found.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
GetImage (
|
||
|
IN EDKII_PLATFORM_LOGO_PROTOCOL *This,
|
||
|
IN OUT UINT32 *Instance,
|
||
|
OUT EFI_IMAGE_INPUT *Image,
|
||
|
OUT EDKII_PLATFORM_LOGO_DISPLAY_ATTRIBUTE *Attribute,
|
||
|
OUT INTN *OffsetX,
|
||
|
OUT INTN *OffsetY
|
||
|
)
|
||
|
{
|
||
|
UINT32 Current;
|
||
|
if (Instance == NULL || Image == NULL ||
|
||
|
Attribute == NULL || OffsetX == NULL || OffsetY == NULL) {
|
||
|
return EFI_INVALID_PARAMETER;
|
||
|
}
|
||
|
|
||
|
Current = *Instance;
|
||
|
if (Current >= ARRAY_SIZE (mLogos)) {
|
||
|
return EFI_NOT_FOUND;
|
||
|
}
|
||
|
|
||
|
(*Instance)++;
|
||
|
*Attribute = mLogos[Current].Attribute;
|
||
|
*OffsetX = mLogos[Current].OffsetX;
|
||
|
*OffsetY = mLogos[Current].OffsetY;
|
||
|
return mHiiImageEx->GetImageEx (mHiiImageEx, mHiiHandle, mLogos[Current].ImageId, Image);
|
||
|
}
|
||
|
|
||
|
EDKII_PLATFORM_LOGO_PROTOCOL mPlatformLogo = {
|
||
|
GetImage
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
Entrypoint of this module.
|
||
|
|
||
|
This function is the entrypoint of this module. It installs the Edkii
|
||
|
Platform Logo protocol.
|
||
|
|
||
|
@param ImageHandle The firmware allocated handle for the EFI image.
|
||
|
@param SystemTable A pointer to the EFI System Table.
|
||
|
|
||
|
@retval EFI_SUCCESS The entry point is executed successfully.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
InitializeLogo (
|
||
|
IN EFI_HANDLE ImageHandle,
|
||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||
|
)
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
EFI_HII_PACKAGE_LIST_HEADER *PackageList;
|
||
|
EFI_HII_DATABASE_PROTOCOL *HiiDatabase;
|
||
|
EFI_HANDLE Handle;
|
||
|
|
||
|
Status = gBS->LocateProtocol (
|
||
|
&gEfiHiiDatabaseProtocolGuid,
|
||
|
NULL,
|
||
|
(VOID **) &HiiDatabase
|
||
|
);
|
||
|
ASSERT_EFI_ERROR (Status);
|
||
|
|
||
|
Status = gBS->LocateProtocol (
|
||
|
&gEfiHiiImageExProtocolGuid,
|
||
|
NULL,
|
||
|
(VOID **) &mHiiImageEx
|
||
|
);
|
||
|
ASSERT_EFI_ERROR (Status);
|
||
|
|
||
|
//
|
||
|
// Retrieve HII package list from ImageHandle
|
||
|
//
|
||
|
Status = gBS->OpenProtocol (
|
||
|
ImageHandle,
|
||
|
&gEfiHiiPackageListProtocolGuid,
|
||
|
(VOID **) &PackageList,
|
||
|
ImageHandle,
|
||
|
NULL,
|
||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||
|
);
|
||
|
if (EFI_ERROR (Status)) {
|
||
|
DEBUG ((DEBUG_ERROR, "HII Image Package with logo not found in PE/COFF resource section\n"));
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Publish HII package list to HII Database.
|
||
|
//
|
||
|
Status = HiiDatabase->NewPackageList (
|
||
|
HiiDatabase,
|
||
|
PackageList,
|
||
|
NULL,
|
||
|
&mHiiHandle
|
||
|
);
|
||
|
if (!EFI_ERROR (Status)) {
|
||
|
Handle = NULL;
|
||
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||
|
&Handle,
|
||
|
&gEdkiiPlatformLogoProtocolGuid, &mPlatformLogo,
|
||
|
NULL
|
||
|
);
|
||
|
}
|
||
|
return Status;
|
||
|
}
|