return EFI_NOT_FOUND;\r
}\r
\r
+/**\r
+ Patch TPM2 device HID string. The initial string tag in TPM2 ACPI table is "NNN0000".\r
+\r
+ @param[in, out] Table The TPM2 SSDT ACPI table.\r
+\r
+ @return HID Update status.\r
+\r
+**/\r
+EFI_STATUS\r
+UpdateHID (\r
+ EFI_ACPI_DESCRIPTION_HEADER *Table\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINT8 *DataPtr;\r
+ CHAR8 HID[TPM_HID_ACPI_SIZE];\r
+ UINT32 ManufacturerID;\r
+ UINT32 FirmwareVersion1;\r
+ UINT32 FirmwareVersion2;\r
+ BOOLEAN PnpHID;\r
+\r
+ PnpHID = TRUE;\r
+\r
+ //\r
+ // Initialize HID with Default PNP string\r
+ //\r
+ ZeroMem(HID, TPM_HID_ACPI_SIZE);\r
+ CopyMem(HID, TPM_HID_TAG, TPM_HID_PNP_SIZE);\r
+\r
+ //\r
+ // Get Manufacturer ID\r
+ //\r
+ Status = Tpm2GetCapabilityManufactureID(&ManufacturerID);\r
+ if (!EFI_ERROR(Status)) {\r
+ DEBUG((EFI_D_INFO, "TPM_PT_MANUFACTURER 0x%08x\n", ManufacturerID));\r
+ //\r
+ // ManfacturerID defined in TCG Vendor ID Registry \r
+ // may tailed with 0x00 or 0x20\r
+ //\r
+ if ((ManufacturerID >> 24) == 0x00 || ((ManufacturerID >> 24) == 0x20)) {\r
+ //\r
+ // HID containing PNP ID "NNN####"\r
+ // NNN is uppercase letter for Vendor ID specified by manufacturer\r
+ //\r
+ CopyMem(HID, &ManufacturerID, 3);\r
+ } else {\r
+ //\r
+ // HID containing ACP ID "NNNN####"\r
+ // NNNN is uppercase letter for Vendor ID specified by manufacturer\r
+ //\r
+ CopyMem(HID, &ManufacturerID, 4);\r
+ PnpHID = FALSE;\r
+ }\r
+ } else {\r
+ DEBUG ((EFI_D_ERROR, "Get TPM_PT_MANUFACTURER failed %x!\n", Status));\r
+ ASSERT(FALSE);\r
+ return Status;\r
+ }\r
+\r
+ Status = Tpm2GetCapabilityFirmwareVersion(&FirmwareVersion1, &FirmwareVersion2);\r
+ if (!EFI_ERROR(Status)) {\r
+ DEBUG((EFI_D_INFO, "TPM_PT_FIRMWARE_VERSION_1 0x%x\n", FirmwareVersion1));\r
+ DEBUG((EFI_D_INFO, "TPM_PT_FIRMWARE_VERSION_2 0x%x\n", FirmwareVersion2));\r
+ //\r
+ // #### is Firmware Version 1\r
+ //\r
+ if (PnpHID) {\r
+ AsciiSPrint(HID + 3, TPM_HID_PNP_SIZE - 3, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 && 0x0000FFFF));\r
+ } else {\r
+ AsciiSPrint(HID + 4, TPM_HID_ACPI_SIZE - 4, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 && 0x0000FFFF));\r
+ }\r
+ \r
+ } else {\r
+ DEBUG ((EFI_D_ERROR, "Get TPM_PT_FIRMWARE_VERSION_X failed %x!\n", Status));\r
+ ASSERT(FALSE);\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Patch HID in ASL code before loading the SSDT.\r
+ //\r
+ for (DataPtr = (UINT8 *)(Table + 1);\r
+ DataPtr <= (UINT8 *) ((UINT8 *) Table + Table->Length - TPM_HID_PNP_SIZE);\r
+ DataPtr += 1) {\r
+ if (AsciiStrCmp((CHAR8 *)DataPtr, TPM_HID_TAG) == 0) {\r
+ if (PnpHID) {\r
+ CopyMem(DataPtr, HID, TPM_HID_PNP_SIZE);\r
+ } else {\r
+ //\r
+ // NOOP will be patched to '\0'\r
+ //\r
+ CopyMem(DataPtr, HID, TPM_HID_ACPI_SIZE);\r
+ }\r
+ DEBUG((EFI_D_INFO, "TPM2 ACPI _HID updated to %a\n", HID));\r
+ return Status;\r
+ }\r
+ }\r
+\r
+ DEBUG((EFI_D_ERROR, "TPM2 ACPI HID TAG for patch not found!\n"));\r
+ return EFI_NOT_FOUND;\r
+}\r
+\r
/**\r
Initialize and publish TPM items in ACPI table.\r
\r
Status = UpdatePPVersion(Table, (CHAR8 *)PcdGetPtr(PcdTcgPhysicalPresenceInterfaceVer));\r
ASSERT_EFI_ERROR (Status);\r
\r
+ //\r
+ // Update TPM2 HID before measuring it to PCR\r
+ //\r
+ Status = UpdateHID(Table);\r
+ if (EFI_ERROR(Status)) {\r
+ return Status;\r
+ }\r
+\r
//\r
// Measure to PCR[0] with event EV_POST_CODE ACPI DATA\r
//\r
#include <Library/UefiBootServicesTableLib.h>\r
#include <Library/DxeServicesLib.h>\r
#include <Library/TpmMeasurementLib.h>\r
-#include <Library/Tpm2DeviceLib.h>\r
+#include <Library/Tpm2CommandLib.h>\r
#include <Library/Tcg2PhysicalPresenceLib.h>\r
#include <Library/IoLib.h>\r
+#include <Library/PrintLib.h>\r
\r
#include <IndustryStandard/TpmPtp.h>\r
\r
#define PHYSICAL_PRESENCE_VERSION_TAG "$PV"\r
#define PHYSICAL_PRESENCE_VERSION_SIZE 4\r
\r
+//\r
+// PNP _HID for TPM2 device\r
+//\r
+#define TPM_HID_TAG "NNN0000"\r
+#define TPM_HID_PNP_SIZE 8\r
+#define TPM_HID_ACPI_SIZE 9\r
+\r
#endif // __TCG_SMM_H__\r