]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c
SecurityPkg:Tpm2DeviceLibDTpm: Support TPM command cancel
[mirror_edk2.git] / SecurityPkg / Library / Tpm2DeviceLibDTpm / Tpm2Ptp.c
CommitLineData
79e748cf
JY
1/** @file\r
2 PTP (Platform TPM Profile) CRB (Command Response Buffer) interface used by dTPM2.0 library.\r
3\r
11cf02f6 4Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
79e748cf
JY
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include <IndustryStandard/Tpm20.h>\r
16\r
17#include <Library/BaseLib.h>\r
18#include <Library/BaseMemoryLib.h>\r
19#include <Library/IoLib.h>\r
20#include <Library/TimerLib.h>\r
21#include <Library/DebugLib.h>\r
22#include <Library/Tpm2DeviceLib.h>\r
23#include <Library/PcdLib.h>\r
24\r
25#include <IndustryStandard/TpmPtp.h>\r
26#include <IndustryStandard/TpmTis.h>\r
27\r
28typedef enum {\r
29 PtpInterfaceTis,\r
30 PtpInterfaceFifo,\r
31 PtpInterfaceCrb,\r
32 PtpInterfaceMax,\r
33} PTP_INTERFACE_TYPE;\r
34\r
35//\r
36// Execution of the command may take from several seconds to minutes for certain\r
37// commands, such as key generation.\r
38//\r
39#define PTP_TIMEOUT_MAX (90000 * 1000) // 90s\r
40\r
41//\r
42// Max TPM command/reponse length\r
43//\r
44#define TPMCMDBUFLENGTH 0x500\r
45\r
46/**\r
47 Check whether TPM PTP register exist.\r
48\r
49 @param[in] Reg Pointer to PTP register.\r
50\r
51 @retval TRUE TPM PTP exists.\r
52 @retval FALSE TPM PTP is not found.\r
53**/\r
54BOOLEAN\r
0e47ac15 55Tpm2IsPtpPresence (\r
79e748cf
JY
56 IN VOID *Reg\r
57 )\r
58{\r
59 UINT8 RegRead;\r
60\r
61 RegRead = MmioRead8 ((UINTN)Reg);\r
62 if (RegRead == 0xFF) {\r
63 //\r
64 // No TPM chip\r
65 //\r
66 return FALSE;\r
67 }\r
68 return TRUE;\r
69}\r
70\r
71/**\r
72 Check whether the value of a TPM chip register satisfies the input BIT setting.\r
73\r
74 @param[in] Register Address port of register to be checked.\r
75 @param[in] BitSet Check these data bits are set.\r
76 @param[in] BitClear Check these data bits are clear.\r
77 @param[in] TimeOut The max wait time (unit MicroSecond) when checking register.\r
78\r
79 @retval EFI_SUCCESS The register satisfies the check bit.\r
80 @retval EFI_TIMEOUT The register can't run into the expected status in time.\r
81**/\r
82EFI_STATUS\r
83PtpCrbWaitRegisterBits (\r
84 IN UINT32 *Register,\r
85 IN UINT32 BitSet,\r
86 IN UINT32 BitClear,\r
87 IN UINT32 TimeOut\r
88 )\r
89{\r
90 UINT32 RegRead;\r
91 UINT32 WaitTime;\r
92\r
93 for (WaitTime = 0; WaitTime < TimeOut; WaitTime += 30){\r
94 RegRead = MmioRead32 ((UINTN)Register);\r
95 if ((RegRead & BitSet) == BitSet && (RegRead & BitClear) == 0) {\r
96 return EFI_SUCCESS;\r
97 }\r
98 MicroSecondDelay (30);\r
99 }\r
100 return EFI_TIMEOUT;\r
101}\r
102\r
103/**\r
104 Get the control of TPM chip.\r
105\r
106 @param[in] CrbReg Pointer to CRB register.\r
107\r
108 @retval EFI_SUCCESS Get the control of TPM chip.\r
109 @retval EFI_INVALID_PARAMETER CrbReg is NULL.\r
110 @retval EFI_NOT_FOUND TPM chip doesn't exit.\r
111 @retval EFI_TIMEOUT Can't get the TPM control in time.\r
112**/\r
113EFI_STATUS\r
114PtpCrbRequestUseTpm (\r
115 IN PTP_CRB_REGISTERS_PTR CrbReg\r
116 )\r
117{\r
118 EFI_STATUS Status;\r
119\r
0e47ac15 120 if (!Tpm2IsPtpPresence (CrbReg)) {\r
79e748cf
JY
121 return EFI_NOT_FOUND;\r
122 }\r
123\r
124 MmioWrite32((UINTN)&CrbReg->LocalityControl, PTP_CRB_LOCALITY_CONTROL_REQUEST_ACCESS);\r
125 Status = PtpCrbWaitRegisterBits (\r
126 &CrbReg->LocalityStatus,\r
127 PTP_CRB_LOCALITY_STATUS_GRANTED,\r
128 0,\r
129 PTP_TIMEOUT_A\r
130 );\r
131 return Status;\r
132}\r
133\r
134/**\r
135 Send a command to TPM for execution and return response data.\r
136\r
137 @param[in] CrbReg TPM register space base address.\r
138 @param[in] BufferIn Buffer for command data.\r
139 @param[in] SizeIn Size of command data.\r
140 @param[in, out] BufferOut Buffer for response data.\r
141 @param[in, out] SizeOut Size of response data.\r
142\r
143 @retval EFI_SUCCESS Operation completed successfully.\r
144 @retval EFI_BUFFER_TOO_SMALL Response data buffer is too small.\r
145 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
146 @retval EFI_UNSUPPORTED Unsupported TPM version\r
147\r
148**/\r
149EFI_STATUS\r
150PtpCrbTpmCommand (\r
151 IN PTP_CRB_REGISTERS_PTR CrbReg,\r
152 IN UINT8 *BufferIn,\r
153 IN UINT32 SizeIn,\r
154 IN OUT UINT8 *BufferOut,\r
155 IN OUT UINT32 *SizeOut\r
156 )\r
157{\r
158 EFI_STATUS Status;\r
159 UINT32 Index;\r
160 UINT32 TpmOutSize;\r
161 UINT16 Data16;\r
162 UINT32 Data32;\r
163\r
164 DEBUG_CODE (\r
165 UINTN DebugSize;\r
166\r
167 DEBUG ((EFI_D_VERBOSE, "PtpCrbTpmCommand Send - "));\r
168 if (SizeIn > 0x100) {\r
169 DebugSize = 0x40;\r
170 } else {\r
171 DebugSize = SizeIn;\r
172 }\r
173 for (Index = 0; Index < DebugSize; Index++) {\r
174 DEBUG ((EFI_D_VERBOSE, "%02x ", BufferIn[Index]));\r
175 }\r
176 if (DebugSize != SizeIn) {\r
177 DEBUG ((EFI_D_VERBOSE, "...... "));\r
178 for (Index = SizeIn - 0x20; Index < SizeIn; Index++) {\r
179 DEBUG ((EFI_D_VERBOSE, "%02x ", BufferIn[Index]));\r
180 }\r
181 }\r
182 DEBUG ((EFI_D_VERBOSE, "\n"));\r
183 );\r
184 TpmOutSize = 0;\r
185\r
186 //\r
187 // STEP 0:\r
188 // Ready is any time the TPM is ready to receive a command, following a write\r
189 // of 1 by software to Request.cmdReady, as indicated by the Status field\r
190 // being cleared to 0.\r
191 //\r
192 MmioWrite32((UINTN)&CrbReg->CrbControlRequest, PTP_CRB_CONTROL_AREA_REQUEST_COMMAND_READY);\r
193 Status = PtpCrbWaitRegisterBits (\r
194 &CrbReg->CrbControlRequest,\r
195 0,\r
196 PTP_CRB_CONTROL_AREA_REQUEST_COMMAND_READY,\r
197 PTP_TIMEOUT_C\r
198 );\r
199 if (EFI_ERROR (Status)) {\r
200 Status = EFI_DEVICE_ERROR;\r
201 goto Exit;\r
202 }\r
203 Status = PtpCrbWaitRegisterBits (\r
204 &CrbReg->CrbControlStatus,\r
205 0,\r
206 PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE,\r
207 PTP_TIMEOUT_C\r
208 );\r
209 if (EFI_ERROR (Status)) {\r
210 Status = EFI_DEVICE_ERROR;\r
211 goto Exit;\r
212 }\r
213\r
214 //\r
215 // STEP 1:\r
216 // Command Reception occurs following a Ready state between the write of the\r
217 // first byte of a command to the Command Buffer and the receipt of a write\r
218 // of 1 to Start.\r
219 //\r
220 for (Index = 0; Index < SizeIn; Index++) {\r
221 MmioWrite8 ((UINTN)&CrbReg->CrbDataBuffer[Index], BufferIn[Index]);\r
222 }\r
223 MmioWrite32 ((UINTN)&CrbReg->CrbControlCommandAddressHigh, (UINT32)RShiftU64 ((UINTN)CrbReg->CrbDataBuffer, 32));\r
224 MmioWrite32 ((UINTN)&CrbReg->CrbControlCommandAddressLow, (UINT32)(UINTN)CrbReg->CrbDataBuffer);\r
225 MmioWrite32 ((UINTN)&CrbReg->CrbControlCommandSize, sizeof(CrbReg->CrbDataBuffer));\r
226\r
227 MmioWrite64 ((UINTN)&CrbReg->CrbControlResponseAddrss, (UINT32)(UINTN)CrbReg->CrbDataBuffer);\r
228 MmioWrite32 ((UINTN)&CrbReg->CrbControlResponseSize, sizeof(CrbReg->CrbDataBuffer));\r
229\r
230 //\r
231 // STEP 2:\r
232 // Command Execution occurs after receipt of a 1 to Start and the TPM\r
233 // clearing Start to 0.\r
234 //\r
235 MmioWrite32((UINTN)&CrbReg->CrbControlStart, PTP_CRB_CONTROL_START);\r
236 Status = PtpCrbWaitRegisterBits (\r
237 &CrbReg->CrbControlStart,\r
238 0,\r
239 PTP_CRB_CONTROL_START,\r
240 PTP_TIMEOUT_MAX\r
241 );\r
242 if (EFI_ERROR (Status)) {\r
11cf02f6
ZC
243 //\r
244 // Command Completion check timeout. Cancel the currently executing command by writing TPM_CRB_CTRL_CANCEL,\r
245 // Expect TPM_RC_CANCELLED or successfully completed response.\r
246 //\r
247 MmioWrite32((UINTN)&CrbReg->CrbControlCancel, PTP_CRB_CONTROL_CANCEL);\r
248 Status = PtpCrbWaitRegisterBits (\r
249 &CrbReg->CrbControlStart,\r
250 0,\r
251 PTP_CRB_CONTROL_START,\r
252 PTP_TIMEOUT_B\r
253 );\r
254 MmioWrite32((UINTN)&CrbReg->CrbControlCancel, 0);\r
255\r
256 if (EFI_ERROR(Status)) {\r
257 //\r
258 // Still in Command Execution state. Try to goIdle, the behavior is agnostic.\r
259 //\r
260 Status = EFI_DEVICE_ERROR;\r
261 goto Exit;\r
262 }\r
79e748cf
JY
263 }\r
264\r
265 //\r
266 // STEP 3:\r
267 // Command Completion occurs after completion of a command (indicated by the\r
268 // TPM clearing TPM_CRB_CTRL_Start_x to 0) and before a write of a 1 by the\r
269 // software to Request.goIdle.\r
270 //\r
271\r
272 //\r
273 // Get response data header\r
274 //\r
275 for (Index = 0; Index < sizeof (TPM2_RESPONSE_HEADER); Index++) {\r
276 BufferOut[Index] = MmioRead8 ((UINTN)&CrbReg->CrbDataBuffer[Index]);\r
277 }\r
278 DEBUG_CODE (\r
279 DEBUG ((EFI_D_VERBOSE, "PtpCrbTpmCommand ReceiveHeader - "));\r
280 for (Index = 0; Index < sizeof (TPM2_RESPONSE_HEADER); Index++) {\r
281 DEBUG ((EFI_D_VERBOSE, "%02x ", BufferOut[Index]));\r
282 }\r
283 DEBUG ((EFI_D_VERBOSE, "\n"));\r
284 );\r
285 //\r
286 // Check the reponse data header (tag, parasize and returncode)\r
287 //\r
288 CopyMem (&Data16, BufferOut, sizeof (UINT16));\r
289 // TPM2 should not use this RSP_COMMAND\r
290 if (SwapBytes16 (Data16) == TPM_ST_RSP_COMMAND) {\r
291 DEBUG ((EFI_D_ERROR, "TPM2: TPM_ST_RSP error - %x\n", TPM_ST_RSP_COMMAND));\r
292 Status = EFI_UNSUPPORTED;\r
293 goto Exit;\r
294 }\r
295\r
296 CopyMem (&Data32, (BufferOut + 2), sizeof (UINT32));\r
297 TpmOutSize = SwapBytes32 (Data32);\r
298 if (*SizeOut < TpmOutSize) {\r
299 Status = EFI_BUFFER_TOO_SMALL;\r
300 goto Exit;\r
301 }\r
302 *SizeOut = TpmOutSize;\r
303 //\r
304 // Continue reading the remaining data\r
305 //\r
306 for (Index = sizeof (TPM2_RESPONSE_HEADER); Index < TpmOutSize; Index++) {\r
307 BufferOut[Index] = MmioRead8 ((UINTN)&CrbReg->CrbDataBuffer[Index]);\r
308 }\r
309Exit:\r
310 DEBUG_CODE (\r
311 DEBUG ((EFI_D_VERBOSE, "PtpCrbTpmCommand Receive - "));\r
312 for (Index = 0; Index < TpmOutSize; Index++) {\r
313 DEBUG ((EFI_D_VERBOSE, "%02x ", BufferOut[Index]));\r
314 }\r
315 DEBUG ((EFI_D_VERBOSE, "\n"));\r
316 );\r
317\r
318 //\r
319 // STEP 4:\r
320 // Idle is any time TPM_CRB_CTRL_STS_x.Status.goIdle is 1.\r
321 //\r
322 MmioWrite32((UINTN)&CrbReg->CrbControlRequest, PTP_CRB_CONTROL_AREA_REQUEST_GO_IDLE);\r
323 return Status;\r
324}\r
325\r
326/**\r
327 Send a command to TPM for execution and return response data.\r
328\r
329 @param[in] TisReg TPM register space base address.\r
330 @param[in] BufferIn Buffer for command data.\r
331 @param[in] SizeIn Size of command data.\r
332 @param[in, out] BufferOut Buffer for response data.\r
333 @param[in, out] SizeOut Size of response data.\r
334\r
335 @retval EFI_SUCCESS Operation completed successfully.\r
336 @retval EFI_BUFFER_TOO_SMALL Response data buffer is too small.\r
337 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
338 @retval EFI_UNSUPPORTED Unsupported TPM version\r
339\r
340**/\r
341EFI_STATUS\r
342Tpm2TisTpmCommand (\r
343 IN TIS_PC_REGISTERS_PTR TisReg,\r
344 IN UINT8 *BufferIn,\r
345 IN UINT32 SizeIn,\r
346 IN OUT UINT8 *BufferOut,\r
347 IN OUT UINT32 *SizeOut\r
348 );\r
349\r
350/**\r
351 Get the control of TPM chip by sending requestUse command TIS_PC_ACC_RQUUSE\r
352 to ACCESS Register in the time of default TIS_TIMEOUT_A.\r
353\r
354 @param[in] TisReg Pointer to TIS register.\r
355\r
356 @retval EFI_SUCCESS Get the control of TPM chip.\r
357 @retval EFI_INVALID_PARAMETER TisReg is NULL.\r
358 @retval EFI_NOT_FOUND TPM chip doesn't exit.\r
359 @retval EFI_TIMEOUT Can't get the TPM control in time.\r
360**/\r
361EFI_STATUS\r
362TisPcRequestUseTpm (\r
363 IN TIS_PC_REGISTERS_PTR TisReg\r
364 );\r
365\r
366/**\r
367 Return PTP interface type.\r
368\r
369 @param[in] Register Pointer to PTP register.\r
370\r
371 @return PTP interface type.\r
372**/\r
373PTP_INTERFACE_TYPE\r
0e47ac15 374Tpm2GetPtpInterface (\r
79e748cf
JY
375 IN VOID *Register\r
376 )\r
377{\r
378 PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
379 PTP_FIFO_INTERFACE_CAPABILITY InterfaceCapability;\r
380\r
0e47ac15 381 if (!Tpm2IsPtpPresence (Register)) {\r
79e748cf
JY
382 return PtpInterfaceMax;\r
383 }\r
384 //\r
385 // Check interface id\r
386 //\r
387 InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
388 InterfaceCapability.Uint32 = MmioRead32 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->InterfaceCapability);\r
389\r
390 if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) &&\r
391 (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB) &&\r
392 (InterfaceId.Bits.CapCRB != 0)) {\r
393 return PtpInterfaceCrb;\r
394 }\r
395 if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO) &&\r
396 (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_FIFO) &&\r
397 (InterfaceId.Bits.CapFIFO != 0) &&\r
398 (InterfaceCapability.Bits.InterfaceVersion == INTERFACE_CAPABILITY_INTERFACE_VERSION_PTP)) {\r
399 return PtpInterfaceFifo;\r
400 }\r
401 return PtpInterfaceTis;\r
402}\r
403\r
404/**\r
405 Dump PTP register information.\r
406\r
407 @param[in] Register Pointer to PTP register.\r
408**/\r
409VOID\r
410DumpPtpInfo (\r
411 IN VOID *Register\r
412 )\r
413{\r
414 PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
415 PTP_FIFO_INTERFACE_CAPABILITY InterfaceCapability;\r
416 UINT8 StatusEx;\r
417 UINT16 Vid;\r
418 UINT16 Did;\r
419 UINT8 Rid;\r
420 PTP_INTERFACE_TYPE PtpInterface;\r
421\r
0e47ac15 422 if (!Tpm2IsPtpPresence (Register)) {\r
79e748cf
JY
423 return ;\r
424 }\r
425\r
426 InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
427 InterfaceCapability.Uint32 = MmioRead32 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->InterfaceCapability);\r
428 StatusEx = MmioRead8 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->StatusEx);\r
429\r
430 //\r
431 // Dump InterfaceId Register for PTP\r
432 //\r
433 DEBUG ((EFI_D_INFO, "InterfaceId - 0x%08x\n", InterfaceId.Uint32));\r
434 DEBUG ((EFI_D_INFO, " InterfaceType - 0x%02x\n", InterfaceId.Bits.InterfaceType));\r
435 if (InterfaceId.Bits.InterfaceType != PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_TIS) {\r
436 DEBUG ((EFI_D_INFO, " InterfaceVersion - 0x%02x\n", InterfaceId.Bits.InterfaceVersion));\r
437 DEBUG ((EFI_D_INFO, " CapFIFO - 0x%x\n", InterfaceId.Bits.CapFIFO));\r
438 DEBUG ((EFI_D_INFO, " CapCRB - 0x%x\n", InterfaceId.Bits.CapCRB));\r
439 }\r
440\r
441 //\r
442 // Dump Capability Register for TIS and FIFO\r
443 //\r
444 DEBUG ((EFI_D_INFO, "InterfaceCapability - 0x%08x\n", InterfaceCapability.Uint32));\r
445 if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_TIS) ||\r
446 (InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO)) {\r
447 DEBUG ((EFI_D_INFO, " InterfaceVersion - 0x%x\n", InterfaceCapability.Bits.InterfaceVersion));\r
448 }\r
449\r
450 //\r
451 // Dump StatusEx Register for PTP FIFO\r
452 //\r
453 DEBUG ((EFI_D_INFO, "StatusEx - 0x%02x\n", StatusEx));\r
454 if (InterfaceCapability.Bits.InterfaceVersion == INTERFACE_CAPABILITY_INTERFACE_VERSION_PTP) {\r
455 DEBUG ((EFI_D_INFO, " TpmFamily - 0x%x\n", (StatusEx & PTP_FIFO_STS_EX_TPM_FAMILY) >> PTP_FIFO_STS_EX_TPM_FAMILY_OFFSET));\r
456 }\r
457\r
458 Vid = 0xFFFF;\r
459 Did = 0xFFFF;\r
460 Rid = 0xFF;\r
0e47ac15 461 PtpInterface = Tpm2GetPtpInterface (Register);\r
79e748cf
JY
462 DEBUG ((EFI_D_INFO, "PtpInterface - %x\n", PtpInterface));\r
463 switch (PtpInterface) {\r
464 case PtpInterfaceCrb:\r
465 Vid = MmioRead16 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->Vid);\r
466 Did = MmioRead16 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->Did);\r
467 Rid = (UINT8)InterfaceId.Bits.Rid;\r
468 break;\r
469 case PtpInterfaceFifo:\r
470 case PtpInterfaceTis:\r
471 Vid = MmioRead16 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->Vid);\r
472 Did = MmioRead16 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->Did);\r
473 Rid = MmioRead8 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->Rid);\r
474 break;\r
475 default:\r
476 break;\r
477 }\r
478 DEBUG ((EFI_D_INFO, "VID - 0x%04x\n", Vid));\r
479 DEBUG ((EFI_D_INFO, "DID - 0x%04x\n", Did));\r
480 DEBUG ((EFI_D_INFO, "RID - 0x%02x\n", Rid));\r
481}\r
482\r
483/**\r
484 This service enables the sending of commands to the TPM2.\r
485\r
486 @param[in] InputParameterBlockSize Size of the TPM2 input parameter block.\r
487 @param[in] InputParameterBlock Pointer to the TPM2 input parameter block.\r
488 @param[in,out] OutputParameterBlockSize Size of the TPM2 output parameter block.\r
489 @param[in] OutputParameterBlock Pointer to the TPM2 output parameter block.\r
490\r
491 @retval EFI_SUCCESS The command byte stream was successfully sent to the device and a response was successfully received.\r
492 @retval EFI_DEVICE_ERROR The command was not successfully sent to the device or a response was not successfully received from the device.\r
493 @retval EFI_BUFFER_TOO_SMALL The output parameter block is too small.\r
494**/\r
495EFI_STATUS\r
496EFIAPI\r
497DTpm2SubmitCommand (\r
498 IN UINT32 InputParameterBlockSize,\r
499 IN UINT8 *InputParameterBlock,\r
500 IN OUT UINT32 *OutputParameterBlockSize,\r
501 IN UINT8 *OutputParameterBlock\r
502 )\r
503{\r
504 PTP_INTERFACE_TYPE PtpInterface;\r
505\r
0e47ac15 506 PtpInterface = Tpm2GetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
79e748cf
JY
507 switch (PtpInterface) {\r
508 case PtpInterfaceCrb:\r
509 return PtpCrbTpmCommand (\r
510 (PTP_CRB_REGISTERS_PTR) (UINTN) PcdGet64 (PcdTpmBaseAddress),\r
511 InputParameterBlock,\r
512 InputParameterBlockSize,\r
513 OutputParameterBlock,\r
514 OutputParameterBlockSize\r
515 );\r
516 case PtpInterfaceFifo:\r
517 case PtpInterfaceTis:\r
518 return Tpm2TisTpmCommand (\r
519 (TIS_PC_REGISTERS_PTR) (UINTN) PcdGet64 (PcdTpmBaseAddress),\r
520 InputParameterBlock,\r
521 InputParameterBlockSize,\r
522 OutputParameterBlock,\r
523 OutputParameterBlockSize\r
524 );\r
525 default:\r
526 return EFI_NOT_FOUND;\r
527 }\r
528}\r
529\r
530/**\r
531 This service requests use TPM2.\r
532\r
533 @retval EFI_SUCCESS Get the control of TPM2 chip.\r
534 @retval EFI_NOT_FOUND TPM2 not found.\r
535 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
536**/\r
537EFI_STATUS\r
538EFIAPI\r
539DTpm2RequestUseTpm (\r
540 VOID\r
541 )\r
542{\r
543 PTP_INTERFACE_TYPE PtpInterface;\r
544\r
0e47ac15 545 PtpInterface = Tpm2GetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
79e748cf
JY
546 switch (PtpInterface) {\r
547 case PtpInterfaceCrb:\r
548 return PtpCrbRequestUseTpm ((PTP_CRB_REGISTERS_PTR) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
549 case PtpInterfaceFifo:\r
550 case PtpInterfaceTis:\r
551 return TisPcRequestUseTpm ((TIS_PC_REGISTERS_PTR) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
552 default:\r
553 return EFI_NOT_FOUND;\r
554 }\r
555}\r