• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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