OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
TpmInfo.c
Go to the documentation of this file.
1
8#include <Uefi.h>
9#include <Library/IoLib.h>
10#include <Library/PrintLib.h>
11#include <Library/BaseLib.h>
12#include <Library/BaseMemoryLib.h>
13#include <Library/DebugLib.h>
14#include <Library/OcHeciLib.h>
15#include <Library/TimerLib.h>
16#include <Library/UefiApplicationEntryPoint.h>
17#include <Library/UefiBootServicesTableLib.h>
18#include <Library/UefiLib.h>
21
22#define PTT_HCI_TIMEOUT_A 500
23#define PTT_HCI_POLLING_PERIOD 140
24
25STATIC
26EFI_STATUS
28 IN UINTN Address,
29 IN UINT32 BitSet,
30 IN UINT32 BitClear,
31 IN UINT32 Period,
32 IN UINT32 Timeout,
33 OUT UINT32 *Value OPTIONAL
34 )
35{
36 UINT32 Tmp;
37 UINT32 Waited;
38 BOOLEAN Missing;
39
40 Missing = FALSE;
41
42 for (Waited = 0; Waited < Timeout; Waited += Period) {
43 Tmp = MmioRead32 (Address);
44
45 if (Tmp == 0xFFFFFFFF) {
46 Missing = TRUE;
47 continue;
48 }
49
50 if (((Tmp & BitSet) == BitSet) && ((Tmp & BitClear) == 0)) {
51 if (Value != NULL) {
52 *Value = Tmp;
53 }
54
55 return EFI_SUCCESS;
56 }
57
58 MicroSecondDelay (Period);
59 }
60
61 if (Missing) {
62 return EFI_NOT_FOUND;
63 }
64
65 return EFI_TIMEOUT;
66}
67
68STATIC
69EFI_STATUS
71 VOID
72 )
73{
74 EFI_STATUS Status;
75 GEN_GET_FW_CAPSKU MsgGenGetFwCapsSku;
76 GEN_GET_FW_CAPS_SKU_ACK MsgGenGetFwCapsSkuAck;
77 UINT32 Length;
78
79 Status = HeciLocateProtocol ();
80
81 if (EFI_ERROR (Status)) {
82 DEBUG ((DEBUG_WARN, "TPM: No HECI protocol %r\n", Status));
83 return Status;
84 }
85
86 MsgGenGetFwCapsSku.MKHIHeader.Data = 0;
87 MsgGenGetFwCapsSku.MKHIHeader.Fields.GroupId = MKHI_FWCAPS_GROUP_ID;
88 MsgGenGetFwCapsSku.MKHIHeader.Fields.Command = FWCAPS_GET_RULE_CMD;
89 MsgGenGetFwCapsSku.MKHIHeader.Fields.IsResponse = 0;
90 MsgGenGetFwCapsSku.Data.RuleId = 0;
91 Length = sizeof (GEN_GET_FW_CAPSKU);
92
93 Status = HeciSendMessage (
94 (UINT32 *)&MsgGenGetFwCapsSku,
95 Length,
98 );
99
100 if (EFI_ERROR (Status)) {
101 DEBUG ((DEBUG_WARN, "TPM: HECI failed to write %r\n", Status));
102 return Status;
103 }
104
105 ZeroMem (&MsgGenGetFwCapsSkuAck, sizeof (MsgGenGetFwCapsSkuAck));
106
107 Length = sizeof (MsgGenGetFwCapsSkuAck);
108 Status = HeciReadMessage (
109 BLOCKING,
110 (UINT32 *)&MsgGenGetFwCapsSkuAck,
111 &Length
112 );
113
114 if (EFI_ERROR (Status)) {
115 DEBUG ((DEBUG_WARN, "TPM: HECI failed to read %r\n", Status));
116 return Status;
117 }
118
119 if ( (MsgGenGetFwCapsSkuAck.MKHIHeader.Fields.Command == FWCAPS_GET_RULE_CMD)
120 && (MsgGenGetFwCapsSkuAck.MKHIHeader.Fields.IsResponse == 1)
121 && (MsgGenGetFwCapsSkuAck.MKHIHeader.Fields.Result == 0))
122 {
123 if (MsgGenGetFwCapsSkuAck.Data.FWCapSku.Fields.PTT) {
124 DEBUG ((DEBUG_WARN, "TPM: HECI PCH supports TPM\n"));
125 return EFI_SUCCESS;
126 }
127
128 DEBUG ((DEBUG_WARN, "TPM: HECI PCH does NOT support TPM\n"));
129 return EFI_UNSUPPORTED;
130 }
131
132 DEBUG ((DEBUG_WARN, "TPM: HECI got invalid response\n"));
133 return EFI_INVALID_PARAMETER;
134}
135
136EFI_STATUS
137EFIAPI
139 IN EFI_HANDLE ImageHandle,
140 IN EFI_SYSTEM_TABLE *SystemTable
141 )
142{
143 EFI_STATUS Status;
144
145 DEBUG ((DEBUG_WARN, "TPM: Will now verify fTPM (PTT) availability\n"));
146
147 Status = CheckHeci ();
148
149 DEBUG ((DEBUG_WARN, "TPM: HECI returned %r\n", Status));
150
151 Status = MmioRead32Timeout (
157 NULL
158 );
159
160 DEBUG ((
161 DEBUG_WARN,
162 "TPM: Discovered status at 0x%08X is %r\n",
164 Status
165 ));
166
167 Status = MmioRead32Timeout (
173 NULL
174 );
175
176 DEBUG ((
177 DEBUG_WARN,
178 "TPM: Discovered status at 0x%08X is %r\n",
180 Status
181 ));
182
183 return EFI_SUCCESS;
184}
UINT64 Length
struct _GEN_GET_FW_CAPSKU GEN_GET_FW_CAPSKU
#define HECI_CORE_MESSAGE_ADDR
Definition MkhiMsgs.h:25
#define BIOS_FIXED_HOST_ADDR
Definition MkhiMsgs.h:21
@ MKHI_FWCAPS_GROUP_ID
Definition MkhiMsgs.h:110
#define BLOCKING
Definition MkhiMsgs.h:37
#define FWCAPS_GET_RULE_CMD
Definition MkhiMsgs.h:50
EFI_STATUS HeciReadMessage(IN UINT32 Blocking, IN UINT32 *MessageBody, IN OUT UINT32 *Length)
Definition OcHeciLib.c:33
EFI_STATUS HeciLocateProtocol(VOID)
Definition OcHeciLib.c:92
EFI_STATUS HeciSendMessage(IN UINT32 *Message, IN UINT32 Length, IN UINT8 HostAddress, IN UINT8 MEAddress)
Definition OcHeciLib.c:61
#define B_CRB_CONTROL_STS_TPM_STATUS
BIT0.
Definition PttPtpRegs.h:55
#define R_PTT_HCI_BASE_ADDRESS_A
Definition PttPtpRegs.h:30
#define V_PTT_HCI_IGNORE_BITS
Definition PttPtpRegs.h:105
#define R_CRB_CONTROL_STS
Definition PttPtpRegs.h:42
#define R_PTT_HCI_BASE_ADDRESS_B
Definition PttPtpRegs.h:31
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
Definition TpmInfo.c:138
STATIC EFI_STATUS MmioRead32Timeout(IN UINTN Address, IN UINT32 BitSet, IN UINT32 BitClear, IN UINT32 Period, IN UINT32 Timeout, OUT UINT32 *Value OPTIONAL)
Definition TpmInfo.c:27
#define PTT_HCI_TIMEOUT_A
Timeout after 500 microseconds.
Definition TpmInfo.c:22
STATIC EFI_STATUS CheckHeci(VOID)
Definition TpmInfo.c:70
#define PTT_HCI_POLLING_PERIOD
Poll register every 140 microseconds.
Definition TpmInfo.c:23
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
UINT32 EFIAPI MmioRead32(IN UINTN Address)
Definition UserMisc.c:623
UINTN EFIAPI MicroSecondDelay(IN UINTN MicroSeconds)
GEN_GET_FW_CAPS_SKU_ACK_DATA Data
Definition MkhiMsgs.h:387
MKHI_MESSAGE_HEADER MKHIHeader
Definition MkhiMsgs.h:386
GET_RULE_DATA Data
Definition MkhiMsgs.h:299
MKHI_MESSAGE_HEADER MKHIHeader
Definition MkhiMsgs.h:298
UINT32 RuleId
Definition MkhiMsgs.h:294
struct _MKHI_MESSAGE_HEADER::@64 Fields
UINT32 PTT
[29] Platform Trust Technoogy (PTT)
Definition MkhiMsgs.h:354
struct _SECFWCAPS_SKU::@67 Fields