1 /** @file 2 The module entry point for Tcg configuration module. 3 4 Copyright (c) 2011 - 2014, 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 15 #include "TcgConfigImpl.h" 16 #include <Guid/TpmInstance.h> 17 18 /** 19 The entry point for Tcg configuration driver. 20 21 @param[in] ImageHandle The image handle of the driver. 22 @param[in] SystemTable The system table. 23 24 @retval EFI_ALREADY_STARTED The driver already exists in system. 25 @retval EFI_OUT_OF_RESOURCES Fail to execute entry point due to lack of resources. 26 @retval EFI_SUCCES All the related protocols are installed on the driver. 27 @retval Others Fail to install protocols as indicated. 28 29 **/ 30 EFI_STATUS 31 EFIAPI 32 TcgConfigDriverEntryPoint ( 33 IN EFI_HANDLE ImageHandle, 34 IN EFI_SYSTEM_TABLE *SystemTable 35 ) 36 { 37 EFI_STATUS Status; 38 TCG_CONFIG_PRIVATE_DATA *PrivateData; 39 EFI_TCG_PROTOCOL *TcgProtocol; 40 41 if (!CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &gEfiTpmDeviceInstanceTpm12Guid)){ 42 DEBUG ((EFI_D_ERROR, "No TPM12 instance required!\n")); 43 return EFI_UNSUPPORTED; 44 } 45 46 Status = TisPcRequestUseTpm ((TIS_TPM_HANDLE) (UINTN) TPM_BASE_ADDRESS); 47 if (EFI_ERROR (Status)) { 48 DEBUG ((EFI_D_ERROR, "TPM not detected!\n")); 49 return Status; 50 } 51 52 Status = gBS->LocateProtocol (&gEfiTcgProtocolGuid, NULL, (VOID **) &TcgProtocol); 53 if (EFI_ERROR (Status)) { 54 TcgProtocol = NULL; 55 } 56 57 Status = gBS->OpenProtocol ( 58 ImageHandle, 59 &gEfiCallerIdGuid, 60 NULL, 61 ImageHandle, 62 ImageHandle, 63 EFI_OPEN_PROTOCOL_TEST_PROTOCOL 64 ); 65 if (!EFI_ERROR (Status)) { 66 return EFI_ALREADY_STARTED; 67 } 68 69 // 70 // Create a private data structure. 71 // 72 PrivateData = AllocateCopyPool (sizeof (TCG_CONFIG_PRIVATE_DATA), &mTcgConfigPrivateDateTemplate); 73 if (PrivateData == NULL) { 74 return EFI_OUT_OF_RESOURCES; 75 } 76 77 PrivateData->TcgProtocol = TcgProtocol; 78 79 // 80 // Install TCG configuration form 81 // 82 Status = InstallTcgConfigForm (PrivateData); 83 if (EFI_ERROR (Status)) { 84 goto ErrorExit; 85 } 86 87 // 88 // Install private GUID. 89 // 90 Status = gBS->InstallMultipleProtocolInterfaces ( 91 &ImageHandle, 92 &gEfiCallerIdGuid, 93 PrivateData, 94 NULL 95 ); 96 97 if (EFI_ERROR (Status)) { 98 goto ErrorExit; 99 } 100 101 return EFI_SUCCESS; 102 103 ErrorExit: 104 if (PrivateData != NULL) { 105 UninstallTcgConfigForm (PrivateData); 106 } 107 108 return Status; 109 } 110 111 /** 112 Unload the Tcg configuration form. 113 114 @param[in] ImageHandle The driver's image handle. 115 116 @retval EFI_SUCCESS The Tcg configuration form is unloaded. 117 @retval Others Failed to unload the form. 118 119 **/ 120 EFI_STATUS 121 EFIAPI 122 TcgConfigDriverUnload ( 123 IN EFI_HANDLE ImageHandle 124 ) 125 { 126 EFI_STATUS Status; 127 TCG_CONFIG_PRIVATE_DATA *PrivateData; 128 129 Status = gBS->HandleProtocol ( 130 ImageHandle, 131 &gEfiCallerIdGuid, 132 (VOID **) &PrivateData 133 ); 134 if (EFI_ERROR (Status)) { 135 return Status; 136 } 137 138 ASSERT (PrivateData->Signature == TCG_CONFIG_PRIVATE_DATA_SIGNATURE); 139 140 gBS->UninstallMultipleProtocolInterfaces ( 141 &ImageHandle, 142 &gEfiCallerIdGuid, 143 PrivateData, 144 NULL 145 ); 146 147 UninstallTcgConfigForm (PrivateData); 148 149 return EFI_SUCCESS; 150 } 151