1 /*++ 2 3 Copyright (c) 1999 - 2015, Intel Corporation. All rights reserved 4 5 This program and the accompanying materials are licensed and made available under 6 the terms and conditions of the BSD License that accompanies this distribution. 7 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 16 #include <Uefi.h> 17 #include <PiPei.h> 18 #include <Ppi/PttPassThruPpi.h> 19 #include <Library/BaseLib.h> 20 #include <Library/BaseMemoryLib.h> 21 #include <Library/IoLib.h> 22 #include <Library/DebugLib.h> 23 #include <Library/PeiServicesLib.h> 24 #include <Library/PcdLib.h> 25 26 27 28 29 30 31 PTT_PASS_THRU_PPI *SecPttPassThruPpi = NULL; 32 33 /** 34 The constructor function caches the pointer to PEI services. 35 36 The constructor function caches the pointer to PEI services. 37 It will always return EFI_SUCCESS. 38 39 @param FfsHeader Pointer to FFS header the loaded driver. 40 @param PeiServices Pointer to the PEI services. 41 42 @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. 43 44 **/ 45 EFI_STATUS 46 EFIAPI 47 Tpm2DeviceLibConstructor ( 48 VOID 49 ) 50 { 51 EFI_STATUS Status = EFI_SUCCESS; 52 53 Status = PeiServicesLocatePpi (&gPttPassThruPpiGuid, 0, NULL, (VOID **) &SecPttPassThruPpi); 54 if (EFI_ERROR (Status)) { 55 // Locate the PPI failed 56 SecPttPassThruPpi = NULL; 57 } 58 return Status; 59 } 60 61 /** 62 This service enables the sending of commands to the TPM2. 63 64 @param[in] InputParameterBlockSize Size of the TPM2 input parameter block. 65 @param[in] InputParameterBlock Pointer to the TPM2 input parameter block. 66 @param[in] OutputParameterBlockSize Size of the TPM2 output parameter block. 67 @param[in] OutputParameterBlock Pointer to the TPM2 output parameter block. 68 69 @retval EFI_SUCCESS The command byte stream was successfully sent to the device and a response was successfully received. 70 @retval EFI_DEVICE_ERROR The command was not successfully sent to the device or a response was not successfully received from the device. 71 @retval EFI_BUFFER_TOO_SMALL The output parameter block is too small. 72 **/ 73 EFI_STATUS 74 EFIAPI 75 Tpm2SubmitCommand ( 76 IN UINT32 InputParameterBlockSize, 77 IN UINT8 *InputParameterBlock, 78 IN OUT UINT32 *OutputParameterBlockSize, 79 IN UINT8 *OutputParameterBlock 80 ) 81 { 82 EFI_STATUS Status = EFI_SUCCESS; 83 84 if(NULL == InputParameterBlock || NULL == OutputParameterBlock || 0 == InputParameterBlockSize) { 85 DEBUG ((EFI_D_ERROR, "Buffer == NULL or InputParameterBlockSize == 0\n")); 86 Status = EFI_INVALID_PARAMETER; 87 return Status; 88 } 89 90 if (NULL == SecPttPassThruPpi) { 91 // Don't locate PPI by calling Tpm2DeviceLibConstructor() function?? 92 Status = EFI_DEVICE_ERROR; 93 return Status; 94 } 95 96 Status = SecPttPassThruPpi->Tpm2SubmitCommand ( 97 SecPttPassThruPpi, 98 InputParameterBlockSize, 99 InputParameterBlock, 100 OutputParameterBlockSize, 101 OutputParameterBlock 102 ); 103 104 return Status; 105 } 106 107 /** 108 This service requests use TPM2. 109 110 @retval EFI_SUCCESS Get the control of TPM2 chip. 111 @retval EFI_NOT_FOUND TPM2 not found. 112 @retval EFI_DEVICE_ERROR Unexpected device behavior. 113 **/ 114 EFI_STATUS 115 EFIAPI 116 Tpm2RequestUseTpm ( 117 VOID 118 ) 119 { 120 EFI_STATUS Status = EFI_SUCCESS; 121 122 if (NULL == SecPttPassThruPpi) { 123 // Don't locate PPI by calling Tpm2DeviceLibConstructor() function?? 124 Status = EFI_DEVICE_ERROR; 125 return Status; 126 } 127 128 Status = SecPttPassThruPpi->Tpm2RequestUseTpm (SecPttPassThruPpi); 129 130 return Status; 131 } 132 133 /** 134 This service register TPM2 device. 135 136 @Param Tpm2Device TPM2 device 137 138 @retval EFI_SUCCESS This TPM2 device is registered successfully. 139 @retval EFI_UNSUPPORTED System does not support register this TPM2 device. 140 @retval EFI_ALREADY_STARTED System already register this TPM2 device. 141 **/ 142 EFI_STATUS 143 EFIAPI 144 Tpm2RegisterTpm2DeviceLib ( 145 IN PTT_TPM2_DEVICE_INTERFACE *Tpm2Device 146 ) 147 { 148 return EFI_UNSUPPORTED; 149 } 150 151 152