01f78bf0befbaef8872f7639a28d3f1cc54b0316
[mirror_edk2.git] / SecurityPkg / Library / Tpm2DeviceLibDTpm / Tpm2InstanceLibDTpm.c
1 /** @file
2 This library is TPM2 DTPM instance.
3 It can be registered to Tpm2 Device router, to be active TPM2 engine,
4 based on platform setting.
5
6 Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved. <BR>
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
11
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14
15 **/
16
17 #include <Library/BaseLib.h>
18 #include <Library/BaseMemoryLib.h>
19 #include <Library/DebugLib.h>
20 #include <Library/Tpm2DeviceLib.h>
21 #include <Library/PcdLib.h>
22
23 #include <Guid/TpmInstance.h>
24
25 /**
26 Return PTP interface type.
27
28 @param[in] Register Pointer to PTP register.
29
30 @return PTP interface type.
31 **/
32 TPM2_PTP_INTERFACE_TYPE
33 Tpm2GetPtpInterface (
34 IN VOID *Register
35 );
36
37 /**
38 Dump PTP register information.
39
40 @param[in] Register Pointer to PTP register.
41 **/
42 VOID
43 DumpPtpInfo (
44 IN VOID *Register
45 );
46
47 /**
48 This service enables the sending of commands to the TPM2.
49
50 @param[in] InputParameterBlockSize Size of the TPM2 input parameter block.
51 @param[in] InputParameterBlock Pointer to the TPM2 input parameter block.
52 @param[in,out] OutputParameterBlockSize Size of the TPM2 output parameter block.
53 @param[in] OutputParameterBlock Pointer to the TPM2 output parameter block.
54
55 @retval EFI_SUCCESS The command byte stream was successfully sent to the device and a response was successfully received.
56 @retval EFI_DEVICE_ERROR The command was not successfully sent to the device or a response was not successfully received from the device.
57 @retval EFI_BUFFER_TOO_SMALL The output parameter block is too small.
58 **/
59 EFI_STATUS
60 EFIAPI
61 DTpm2SubmitCommand (
62 IN UINT32 InputParameterBlockSize,
63 IN UINT8 *InputParameterBlock,
64 IN OUT UINT32 *OutputParameterBlockSize,
65 IN UINT8 *OutputParameterBlock
66 );
67
68 /**
69 This service requests use TPM2.
70
71 @retval EFI_SUCCESS Get the control of TPM2 chip.
72 @retval EFI_NOT_FOUND TPM2 not found.
73 @retval EFI_DEVICE_ERROR Unexpected device behavior.
74 **/
75 EFI_STATUS
76 EFIAPI
77 DTpm2RequestUseTpm (
78 VOID
79 );
80
81 TPM2_DEVICE_INTERFACE mDTpm2InternalTpm2Device = {
82 TPM_DEVICE_INTERFACE_TPM20_DTPM,
83 DTpm2SubmitCommand,
84 DTpm2RequestUseTpm,
85 };
86
87 /**
88 The function register DTPM2.0 instance and caches current active TPM interface type.
89
90 @retval EFI_SUCCESS DTPM2.0 instance is registered, or system dose not surpport registr DTPM2.0 instance
91 **/
92 EFI_STATUS
93 EFIAPI
94 Tpm2InstanceLibDTpmConstructor (
95 VOID
96 )
97 {
98 EFI_STATUS Status;
99 TPM2_PTP_INTERFACE_TYPE PtpInterface;
100
101 Status = Tpm2RegisterTpm2DeviceLib (&mDTpm2InternalTpm2Device);
102 if ((Status == EFI_SUCCESS) || (Status == EFI_UNSUPPORTED)) {
103 //
104 // Unsupported means platform policy does not need this instance enabled.
105 //
106 if (Status == EFI_SUCCESS) {
107 //
108 // Cache current active TpmInterfaceType only when needed
109 //
110 if (PcdGet8(PcdActiveTpmInterfaceType) == 0xFF) {
111 PtpInterface = Tpm2GetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));
112 PcdSet8S(PcdActiveTpmInterfaceType, PtpInterface);
113 }
114 DumpPtpInfo ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));
115 }
116 return EFI_SUCCESS;
117 }
118 return Status;
119 }