1 /*++ 2 3 Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved 4 5 This program and the accompanying materials are licensed and made available under 7 the terms and conditions of the BSD License that accompanies this distribution. 9 The full text of the license may be found at 11 http://opensource.org/licenses/bsd-license.php. 13 15 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 17 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 19 21 23 --*/ 24 25 /** @file 26 **/ 27 28 #include <Library/BaseMemoryLib.h> 29 #include <Library/DebugLib.h> 30 #include <Protocol/FirmwareVolume2.h> 31 #include <Protocol/PlatformGopPolicy.h> 32 33 #include <Guid/SetupVariable.h> 34 #include <SetupMode.h> 35 #include <Library/UefiBootServicesTableLib.h> 36 #include <Library/UefiRuntimeServicesTableLib.h> 37 38 PLATFORM_GOP_POLICY_PROTOCOL mPlatformGOPPolicy; 39 40 // 41 // Function implementations 42 // 43 44 /** 45 The function will execute with as the platform policy, and gives 46 the Platform Lid Status. IBV/OEM can customize this code for their specific 47 policy action. 48 49 @param CurrentLidStatus Gives the current LID Status 50 51 @retval EFI_SUCCESS. 52 53 **/ 54 EFI_STATUS 55 EFIAPI 56 GetPlatformLidStatus ( 57 OUT LID_STATUS *CurrentLidStatus 58 ) 59 { 60 *CurrentLidStatus = LidOpen; 61 62 return EFI_SUCCESS; 63 } 64 65 /** 66 The function will execute and gives the Video Bios Table Size and Address. 67 68 @param VbtAddress Gives the Physical Address of Video BIOS Table 69 70 @param VbtSize Gives the Size of Video BIOS Table 71 72 @retval EFI_STATUS. 73 74 **/ 75 76 EFI_STATUS 77 EFIAPI 78 GetVbtData ( 79 OUT EFI_PHYSICAL_ADDRESS *VbtAddress, 80 OUT UINT32 *VbtSize 81 ) 82 { 83 EFI_STATUS Status; 84 UINTN FvProtocolCount; 85 EFI_HANDLE *FvHandles; 86 EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; 87 UINTN Index; 88 UINT32 AuthenticationStatus; 89 90 UINT8 *Buffer; 91 UINTN VbtBufferSize; 92 93 Buffer = 0; 94 FvHandles = NULL; 95 96 if (VbtAddress == NULL || VbtSize == NULL){ 97 return EFI_INVALID_PARAMETER; 98 } 99 Status = gBS->LocateHandleBuffer ( 100 ByProtocol, 101 &gEfiFirmwareVolume2ProtocolGuid, 102 NULL, 103 &FvProtocolCount, 104 &FvHandles 105 ); 106 107 if (!EFI_ERROR (Status)) { 108 for (Index = 0; Index < FvProtocolCount; Index++) { 109 Status = gBS->HandleProtocol ( 110 FvHandles[Index], 111 &gEfiFirmwareVolume2ProtocolGuid, 112 (VOID **) &Fv 113 ); 114 VbtBufferSize = 0; 115 Status = Fv->ReadSection ( 116 Fv, 117 &gBmpImageGuid, 118 EFI_SECTION_RAW, 119 0, 120 (void **)&Buffer, 121 &VbtBufferSize, 122 &AuthenticationStatus 123 ); 124 125 if (!EFI_ERROR (Status)) { 126 *VbtAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer; 127 *VbtSize = (UINT32)VbtBufferSize; 128 Status = EFI_SUCCESS; 129 break; 130 } 131 } 132 } else { 133 Status = EFI_NOT_FOUND; 134 } 135 136 if (FvHandles != NULL) { 137 gBS->FreePool (FvHandles); 138 FvHandles = NULL; 139 } 140 141 return Status; 142 } 143 144 /** 145 Entry point for the Platform GOP Policy Driver. 146 147 @param ImageHandle Image handle of this driver. 148 @param SystemTable Global system service table. 149 150 @retval EFI_SUCCESS Initialization complete. 151 @retval EFI_OUT_OF_RESOURCES Do not have enough resources to initialize the driver. 152 153 **/ 154 155 EFI_STATUS 156 EFIAPI 157 PlatformGOPPolicyEntryPoint ( 158 IN EFI_HANDLE ImageHandle, 159 IN EFI_SYSTEM_TABLE *SystemTable 160 ) 161 162 { 163 EFI_STATUS Status = EFI_SUCCESS; 164 SYSTEM_CONFIGURATION SystemConfiguration; 165 UINTN VarSize; 166 167 168 gBS = SystemTable->BootServices; 169 170 gBS->SetMem ( 171 &mPlatformGOPPolicy, 172 sizeof (PLATFORM_GOP_POLICY_PROTOCOL), 173 0 174 ); 175 176 mPlatformGOPPolicy.Revision = PLATFORM_GOP_POLICY_PROTOCOL_REVISION_01; 177 mPlatformGOPPolicy.GetPlatformLidStatus = GetPlatformLidStatus; 178 mPlatformGOPPolicy.GetVbtData = GetVbtData; 179 180 // 181 // Install protocol to allow access to this Policy. 182 // 183 VarSize = sizeof(SYSTEM_CONFIGURATION); 184 Status = gRT->GetVariable( 185 L"Setup", 186 &gEfiNormalSetupGuid, 187 NULL, 188 &VarSize, 189 &SystemConfiguration 190 ); 191 if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) { 192 //The setup variable is corrupted 193 VarSize = sizeof(SYSTEM_CONFIGURATION); 194 Status = gRT->GetVariable( 195 L"SetupRecovery", 196 &gEfiNormalSetupGuid, 197 NULL, 198 &VarSize, 199 &SystemConfiguration 200 ); 201 ASSERT_EFI_ERROR (Status); 202 } 203 204 if (SystemConfiguration.GOPEnable == 1) 205 { 206 Status = gBS->InstallMultipleProtocolInterfaces ( 207 &ImageHandle, 208 &gPlatformGOPPolicyGuid, 209 &mPlatformGOPPolicy, 210 NULL 211 ); 212 } 213 214 return Status; 215 } 216