\r
**/\r
\r
-#include <Uefi.h>\r
-#include <IndustryStandard/Tpm12.h>\r
+#include <PiPei.h>\r
#include <Library/BaseMemoryLib.h>\r
#include <Library/BaseLib.h>\r
#include <Library/Tpm12DeviceLib.h>\r
TPM_STARTUP_TYPE TpmSt;\r
} TPM_CMD_START_UP;\r
\r
-typedef struct {\r
- TPM_RSP_COMMAND_HDR Hdr;\r
-} TPM_RSP_START_UP;\r
-\r
#pragma pack()\r
\r
/**\r
EFI_STATUS\r
EFIAPI\r
Tpm12Startup (\r
- IN TPM_STARTUP_TYPE TpmSt\r
+ IN TPM_STARTUP_TYPE TpmSt\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT32 TpmRecvSize;\r
- UINT32 TpmSendSize;\r
- TPM_CMD_START_UP SendBuffer;\r
- TPM_RSP_START_UP RecvBuffer;\r
- UINT32 ReturnCode;\r
+ EFI_STATUS Status;\r
+ TPM_CMD_START_UP Command;\r
+ TPM_RSP_COMMAND_HDR Response;\r
+ UINT32 Length;\r
\r
//\r
// send Tpm command TPM_ORD_Startup\r
//\r
- TpmRecvSize = sizeof (TPM_RSP_START_UP);\r
- TpmSendSize = sizeof (TPM_CMD_START_UP);\r
- SendBuffer.Hdr.tag = SwapBytes16 (TPM_TAG_RQU_COMMAND);\r
- SendBuffer.Hdr.paramSize = SwapBytes32 (TpmSendSize);\r
- SendBuffer.Hdr.ordinal = SwapBytes32 (TPM_ORD_Startup);\r
- SendBuffer.TpmSt = SwapBytes16 (TpmSt);\r
-\r
- Status = Tpm12SubmitCommand (TpmSendSize, (UINT8 *)&SendBuffer, &TpmRecvSize, (UINT8 *)&RecvBuffer);\r
+ Command.Hdr.tag = SwapBytes16 (TPM_TAG_RQU_COMMAND);\r
+ Command.Hdr.paramSize = SwapBytes32 (sizeof (Command));\r
+ Command.Hdr.ordinal = SwapBytes32 (TPM_ORD_Startup);\r
+ Command.TpmSt = SwapBytes16 (TpmSt);\r
+ Length = sizeof (Response);\r
+ Status = Tpm12SubmitCommand (sizeof (Command), (UINT8 *)&Command, &Length, (UINT8 *)&Response);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
- ReturnCode = SwapBytes32(RecvBuffer.Hdr.returnCode);\r
- switch (ReturnCode) {\r
+ switch (SwapBytes32(Response.returnCode)) {\r
case TPM_SUCCESS:\r
case TPM_INVALID_POSTINIT:\r
// In warm reset, TPM may response TPM_INVALID_POSTINIT\r
default:\r
return EFI_DEVICE_ERROR;\r
}\r
-}
\ No newline at end of file
+}\r
+\r
+/**\r
+ Send SaveState command to TPM1.2.\r
+\r
+ @retval EFI_SUCCESS Operation completed successfully.\r
+ @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+Tpm12SaveState (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ TPM_RQU_COMMAND_HDR Command;\r
+ TPM_RSP_COMMAND_HDR Response;\r
+ UINT32 Length;\r
+\r
+ //\r
+ // send Tpm command TPM_ORD_SaveState\r
+ //\r
+ Command.tag = SwapBytes16 (TPM_TAG_RQU_COMMAND);\r
+ Command.paramSize = SwapBytes32 (sizeof (Command));\r
+ Command.ordinal = SwapBytes32 (TPM_ORD_SaveState);\r
+ Length = sizeof (Response);\r
+ Status = Tpm12SubmitCommand (sizeof (Command), (UINT8 *)&Command, &Length, (UINT8 *)&Response);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ switch (SwapBytes32 (Response.returnCode)) {\r
+ case TPM_SUCCESS:\r
+ return EFI_SUCCESS;\r
+ default:\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+}\r