2 Implement TPM2 Startup related command.
4 Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <BR>
5 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include <IndustryStandard/UefiTcgPlatform.h>
11 #include <Library/Tpm2CommandLib.h>
12 #include <Library/Tpm2DeviceLib.h>
13 #include <Library/BaseMemoryLib.h>
14 #include <Library/BaseLib.h>
15 #include <Library/DebugLib.h>
20 TPM2_COMMAND_HEADER Header
;
22 } TPM2_STARTUP_COMMAND
;
25 TPM2_RESPONSE_HEADER Header
;
26 } TPM2_STARTUP_RESPONSE
;
29 TPM2_COMMAND_HEADER Header
;
31 } TPM2_SHUTDOWN_COMMAND
;
34 TPM2_RESPONSE_HEADER Header
;
35 } TPM2_SHUTDOWN_RESPONSE
;
40 Send Startup command to TPM2.
42 @param[in] StartupType TPM_SU_CLEAR or TPM_SU_STATE
44 @retval EFI_SUCCESS Operation completed successfully.
45 @retval EFI_DEVICE_ERROR Unexpected device behavior.
54 TPM2_STARTUP_COMMAND Cmd
;
55 TPM2_STARTUP_RESPONSE Res
;
59 Cmd
.Header
.tag
= SwapBytes16(TPM_ST_NO_SESSIONS
);
60 Cmd
.Header
.paramSize
= SwapBytes32(sizeof(Cmd
));
61 Cmd
.Header
.commandCode
= SwapBytes32(TPM_CC_Startup
);
62 Cmd
.StartupType
= SwapBytes16(StartupType
);
64 ResultBufSize
= sizeof(Res
);
65 Status
= Tpm2SubmitCommand (sizeof(Cmd
), (UINT8
*)&Cmd
, &ResultBufSize
, (UINT8
*)&Res
);
66 if (EFI_ERROR(Status
)) {
70 ResponseCode
= SwapBytes32(Res
.Header
.responseCode
);
71 switch (ResponseCode
) {
73 DEBUG ((DEBUG_INFO
, "TPM2Startup: TPM_RC_SUCCESS\n"));
75 case TPM_RC_INITIALIZE
:
76 // TPM_RC_INITIALIZE can be returned if Tpm2Startup is not required.
77 DEBUG ((DEBUG_INFO
, "TPM2Startup: TPM_RC_INITIALIZE\n"));
80 DEBUG ((EFI_D_ERROR
, "Tpm2Startup: Response Code error! 0x%08x\r\n", ResponseCode
));
81 return EFI_DEVICE_ERROR
;
86 Send Shutdown command to TPM2.
88 @param[in] ShutdownType TPM_SU_CLEAR or TPM_SU_STATE.
90 @retval EFI_SUCCESS Operation completed successfully.
91 @retval EFI_DEVICE_ERROR Unexpected device behavior.
96 IN TPM_SU ShutdownType
100 TPM2_SHUTDOWN_COMMAND Cmd
;
101 TPM2_SHUTDOWN_RESPONSE Res
;
102 UINT32 ResultBufSize
;
104 Cmd
.Header
.tag
= SwapBytes16(TPM_ST_NO_SESSIONS
);
105 Cmd
.Header
.paramSize
= SwapBytes32(sizeof(Cmd
));
106 Cmd
.Header
.commandCode
= SwapBytes32(TPM_CC_Shutdown
);
107 Cmd
.ShutdownType
= SwapBytes16(ShutdownType
);
109 ResultBufSize
= sizeof(Res
);
110 Status
= Tpm2SubmitCommand (sizeof(Cmd
), (UINT8
*)&Cmd
, &ResultBufSize
, (UINT8
*)&Res
);
111 if (EFI_ERROR(Status
)) {
115 if (SwapBytes32(Res
.Header
.responseCode
) != TPM_RC_SUCCESS
) {
116 DEBUG ((EFI_D_ERROR
, "Tpm2Shutdown: Response Code error! 0x%08x\r\n", SwapBytes32(Res
.Header
.responseCode
)));
117 return EFI_DEVICE_ERROR
;