/** @file Logo DXE Driver, install Edkii Platform Logo protocol. Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include 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; }