1 /** @file
2 Logo DXE Driver, install Edkii Platform Logo protocol.
3
4 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14 #include <Uefi.h>
15 #include <Protocol/HiiDatabase.h>
16 #include <Protocol/GraphicsOutput.h>
17 #include <Protocol/HiiImageEx.h>
18 #include <Protocol/PlatformLogo.h>
19 #include <Protocol/HiiPackageList.h>
20 #include <Library/UefiBootServicesTableLib.h>
21 #include <Library/DebugLib.h>
22
23 typedef struct {
24 EFI_IMAGE_ID ImageId;
25 EDKII_PLATFORM_LOGO_DISPLAY_ATTRIBUTE Attribute;
26 INTN OffsetX;
27 INTN OffsetY;
28 } LOGO_ENTRY;
29
30 EFI_HII_IMAGE_EX_PROTOCOL *mHiiImageEx;
31 EFI_HII_HANDLE mHiiHandle;
32 LOGO_ENTRY mLogos[] = {
33 {
34 IMAGE_TOKEN (IMG_LOGO),
35 EdkiiPlatformLogoDisplayAttributeCenter,
36 0,
37 0
38 }
39 };
40
41 /**
42 Load a platform logo image and return its data and attributes.
43
44 @param This The pointer to this protocol instance.
45 @param Instance The visible image instance is found.
46 @param Image Points to the image.
47 @param Attribute The display attributes of the image returned.
48 @param OffsetX The X offset of the image regarding the Attribute.
49 @param OffsetY The Y offset of the image regarding the Attribute.
50
51 @retval EFI_SUCCESS The image was fetched successfully.
52 @retval EFI_NOT_FOUND The specified image could not be found.
53 **/
54 EFI_STATUS
55 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)56 GetImage (
57 IN EDKII_PLATFORM_LOGO_PROTOCOL *This,
58 IN OUT UINT32 *Instance,
59 OUT EFI_IMAGE_INPUT *Image,
60 OUT EDKII_PLATFORM_LOGO_DISPLAY_ATTRIBUTE *Attribute,
61 OUT INTN *OffsetX,
62 OUT INTN *OffsetY
63 )
64 {
65 UINT32 Current;
66 if (Instance == NULL || Image == NULL ||
67 Attribute == NULL || OffsetX == NULL || OffsetY == NULL) {
68 return EFI_INVALID_PARAMETER;
69 }
70
71 Current = *Instance;
72 if (Current >= ARRAY_SIZE (mLogos)) {
73 return EFI_NOT_FOUND;
74 }
75
76 (*Instance)++;
77 *Attribute = mLogos[Current].Attribute;
78 *OffsetX = mLogos[Current].OffsetX;
79 *OffsetY = mLogos[Current].OffsetY;
80 return mHiiImageEx->GetImageEx (mHiiImageEx, mHiiHandle, mLogos[Current].ImageId, Image);
81 }
82
83 EDKII_PLATFORM_LOGO_PROTOCOL mPlatformLogo = {
84 GetImage
85 };
86
87 /**
88 Entrypoint of this module.
89
90 This function is the entrypoint of this module. It installs the Edkii
91 Platform Logo protocol.
92
93 @param ImageHandle The firmware allocated handle for the EFI image.
94 @param SystemTable A pointer to the EFI System Table.
95
96 @retval EFI_SUCCESS The entry point is executed successfully.
97
98 **/
99 EFI_STATUS
100 EFIAPI
InitializeLogo(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)101 InitializeLogo (
102 IN EFI_HANDLE ImageHandle,
103 IN EFI_SYSTEM_TABLE *SystemTable
104 )
105 {
106 EFI_STATUS Status;
107 EFI_HII_PACKAGE_LIST_HEADER *PackageList;
108 EFI_HII_DATABASE_PROTOCOL *HiiDatabase;
109 EFI_HANDLE Handle;
110
111 Status = gBS->LocateProtocol (
112 &gEfiHiiDatabaseProtocolGuid,
113 NULL,
114 (VOID **) &HiiDatabase
115 );
116 ASSERT_EFI_ERROR (Status);
117
118 Status = gBS->LocateProtocol (
119 &gEfiHiiImageExProtocolGuid,
120 NULL,
121 (VOID **) &mHiiImageEx
122 );
123 ASSERT_EFI_ERROR (Status);
124
125 //
126 // Retrieve HII package list from ImageHandle
127 //
128 Status = gBS->OpenProtocol (
129 ImageHandle,
130 &gEfiHiiPackageListProtocolGuid,
131 (VOID **) &PackageList,
132 ImageHandle,
133 NULL,
134 EFI_OPEN_PROTOCOL_GET_PROTOCOL
135 );
136 ASSERT_EFI_ERROR (Status);
137
138 //
139 // Publish HII package list to HII Database.
140 //
141 Status = HiiDatabase->NewPackageList (
142 HiiDatabase,
143 PackageList,
144 NULL,
145 &mHiiHandle
146 );
147 if (!EFI_ERROR (Status)) {
148 Handle = NULL;
149 Status = gBS->InstallMultipleProtocolInterfaces (
150 &Handle,
151 &gEdkiiPlatformLogoProtocolGuid, &mPlatformLogo,
152 NULL
153 );
154 }
155 return Status;
156 }
157