Tpm12Startup.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /** @file
  2. Implement TPM1.2 Startup related command.
  3. Copyright (c) 2013, Intel Corporation. All rights reserved. <BR>
  4. (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #include <PiPei.h>
  8. #include <Library/BaseMemoryLib.h>
  9. #include <Library/BaseLib.h>
  10. #include <Library/Tpm12DeviceLib.h>
  11. #include <Library/DebugLib.h>
  12. #pragma pack(1)
  13. typedef struct {
  14. TPM_RQU_COMMAND_HDR Hdr;
  15. TPM_STARTUP_TYPE TpmSt;
  16. } TPM_CMD_START_UP;
  17. #pragma pack()
  18. /**
  19. Send Startup command to TPM1.2.
  20. @param TpmSt Startup Type.
  21. @retval EFI_SUCCESS Operation completed successfully.
  22. @retval EFI_DEVICE_ERROR Unexpected device behavior.
  23. **/
  24. EFI_STATUS
  25. EFIAPI
  26. Tpm12Startup (
  27. IN TPM_STARTUP_TYPE TpmSt
  28. )
  29. {
  30. EFI_STATUS Status;
  31. TPM_CMD_START_UP Command;
  32. TPM_RSP_COMMAND_HDR Response;
  33. UINT32 Length;
  34. //
  35. // send Tpm command TPM_ORD_Startup
  36. //
  37. Command.Hdr.tag = SwapBytes16 (TPM_TAG_RQU_COMMAND);
  38. Command.Hdr.paramSize = SwapBytes32 (sizeof (Command));
  39. Command.Hdr.ordinal = SwapBytes32 (TPM_ORD_Startup);
  40. Command.TpmSt = SwapBytes16 (TpmSt);
  41. Length = sizeof (Response);
  42. Status = Tpm12SubmitCommand (sizeof (Command), (UINT8 *)&Command, &Length, (UINT8 *)&Response);
  43. if (EFI_ERROR (Status)) {
  44. return Status;
  45. }
  46. switch (SwapBytes32 (Response.returnCode)) {
  47. case TPM_SUCCESS:
  48. DEBUG ((DEBUG_INFO, "TPM12Startup: TPM_SUCCESS\n"));
  49. return EFI_SUCCESS;
  50. case TPM_INVALID_POSTINIT:
  51. // In warm reset, TPM may response TPM_INVALID_POSTINIT
  52. DEBUG ((DEBUG_INFO, "TPM12Startup: TPM_INVALID_POSTINIT\n"));
  53. return EFI_SUCCESS;
  54. default:
  55. return EFI_DEVICE_ERROR;
  56. }
  57. }
  58. /**
  59. Send SaveState command to TPM1.2.
  60. @retval EFI_SUCCESS Operation completed successfully.
  61. @retval EFI_DEVICE_ERROR Unexpected device behavior.
  62. **/
  63. EFI_STATUS
  64. EFIAPI
  65. Tpm12SaveState (
  66. VOID
  67. )
  68. {
  69. EFI_STATUS Status;
  70. TPM_RQU_COMMAND_HDR Command;
  71. TPM_RSP_COMMAND_HDR Response;
  72. UINT32 Length;
  73. //
  74. // send Tpm command TPM_ORD_SaveState
  75. //
  76. Command.tag = SwapBytes16 (TPM_TAG_RQU_COMMAND);
  77. Command.paramSize = SwapBytes32 (sizeof (Command));
  78. Command.ordinal = SwapBytes32 (TPM_ORD_SaveState);
  79. Length = sizeof (Response);
  80. Status = Tpm12SubmitCommand (sizeof (Command), (UINT8 *)&Command, &Length, (UINT8 *)&Response);
  81. if (EFI_ERROR (Status)) {
  82. return Status;
  83. }
  84. switch (SwapBytes32 (Response.returnCode)) {
  85. case TPM_SUCCESS:
  86. return EFI_SUCCESS;
  87. default:
  88. return EFI_DEVICE_ERROR;
  89. }
  90. }