/** @file\r
The module entry point for Tcg2 configuration module.\r
\r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
**/\r
VOID\r
UpdateDefaultPCRBanks (\r
- IN VOID *HiiPackage,\r
- IN UINTN HiiPackageSize,\r
- IN UINT32 PCRBanks\r
+ IN VOID *HiiPackage,\r
+ IN UINTN HiiPackageSize,\r
+ IN UINT32 PCRBanks\r
)\r
{\r
- EFI_HII_PACKAGE_HEADER *HiiPackageHeader;\r
- EFI_IFR_OP_HEADER *IfrOpCodeHeader;\r
- EFI_IFR_CHECKBOX *IfrCheckBox;\r
- EFI_IFR_DEFAULT *IfrDefault;\r
+ EFI_HII_PACKAGE_HEADER *HiiPackageHeader;\r
+ EFI_IFR_OP_HEADER *IfrOpCodeHeader;\r
+ EFI_IFR_CHECKBOX *IfrCheckBox;\r
+ EFI_IFR_DEFAULT *IfrDefault;\r
\r
HiiPackageHeader = (EFI_HII_PACKAGE_HEADER *)HiiPackage;\r
\r
switch (HiiPackageHeader->Type) {\r
- case EFI_HII_PACKAGE_FORMS:\r
- IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)(HiiPackageHeader + 1);\r
- while ((UINTN)IfrOpCodeHeader < (UINTN)HiiPackageHeader + HiiPackageHeader->Length) {\r
- switch (IfrOpCodeHeader->OpCode) {\r
- case EFI_IFR_CHECKBOX_OP:\r
- IfrCheckBox = (EFI_IFR_CHECKBOX *)IfrOpCodeHeader;\r
- if ((IfrCheckBox->Question.QuestionId >= KEY_TPM2_PCR_BANKS_REQUEST_0) && (IfrCheckBox->Question.QuestionId <= KEY_TPM2_PCR_BANKS_REQUEST_4)) {\r
- IfrDefault = (EFI_IFR_DEFAULT *)(IfrCheckBox + 1);\r
- ASSERT (IfrDefault->Header.OpCode == EFI_IFR_DEFAULT_OP);\r
- ASSERT (IfrDefault->Type == EFI_IFR_TYPE_BOOLEAN);\r
- IfrDefault->Value.b = (BOOLEAN)((PCRBanks >> (IfrCheckBox->Question.QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0)) & 0x1);\r
+ case EFI_HII_PACKAGE_FORMS:\r
+ IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)(HiiPackageHeader + 1);\r
+ while ((UINTN)IfrOpCodeHeader < (UINTN)HiiPackageHeader + HiiPackageHeader->Length) {\r
+ switch (IfrOpCodeHeader->OpCode) {\r
+ case EFI_IFR_CHECKBOX_OP:\r
+ IfrCheckBox = (EFI_IFR_CHECKBOX *)IfrOpCodeHeader;\r
+ if ((IfrCheckBox->Question.QuestionId >= KEY_TPM2_PCR_BANKS_REQUEST_0) && (IfrCheckBox->Question.QuestionId <= KEY_TPM2_PCR_BANKS_REQUEST_4)) {\r
+ IfrDefault = (EFI_IFR_DEFAULT *)(IfrCheckBox + 1);\r
+ ASSERT (IfrDefault->Header.OpCode == EFI_IFR_DEFAULT_OP);\r
+ ASSERT (IfrDefault->Type == EFI_IFR_TYPE_BOOLEAN);\r
+ IfrDefault->Value.b = (BOOLEAN)((PCRBanks >> (IfrCheckBox->Question.QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0)) & 0x1);\r
+ }\r
+\r
+ break;\r
}\r
- break;\r
+\r
+ IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)((UINTN)IfrOpCodeHeader + IfrOpCodeHeader->Length);\r
+ }\r
+\r
+ break;\r
+ }\r
+\r
+ return;\r
+}\r
+\r
+/**\r
+ Initialize TCG2 version information.\r
+\r
+ This function will initialize efi varstore configuration data for\r
+ TCG2_VERSION_NAME variable, check the value of related PCD with\r
+ the variable value and set string for the version state content\r
+ according to the PCD value.\r
+\r
+ @param[in] PrivateData Points to TCG2 configuration private data.\r
+\r
+**/\r
+VOID\r
+InitializeTcg2VersionInfo (\r
+ IN TCG2_CONFIG_PRIVATE_DATA *PrivateData\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_STRING ConfigRequestHdr;\r
+ BOOLEAN ActionFlag;\r
+ TCG2_VERSION Tcg2Version;\r
+ UINTN DataSize;\r
+ UINT64 PcdTcg2PpiVersion;\r
+ UINT8 PcdTpm2AcpiTableRev;\r
+\r
+ //\r
+ // Get the PCD value before initializing efi varstore configuration data.\r
+ //\r
+ PcdTcg2PpiVersion = 0;\r
+ CopyMem (\r
+ &PcdTcg2PpiVersion,\r
+ PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer),\r
+ AsciiStrSize ((CHAR8 *)PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer))\r
+ );\r
+\r
+ PcdTpm2AcpiTableRev = PcdGet8 (PcdTpm2AcpiTableRev);\r
+\r
+ //\r
+ // Initialize efi varstore configuration data.\r
+ //\r
+ ZeroMem (&Tcg2Version, sizeof (Tcg2Version));\r
+ ConfigRequestHdr = HiiConstructConfigHdr (\r
+ &gTcg2ConfigFormSetGuid,\r
+ TCG2_VERSION_NAME,\r
+ PrivateData->DriverHandle\r
+ );\r
+ ASSERT (ConfigRequestHdr != NULL);\r
+ DataSize = sizeof (Tcg2Version);\r
+ Status = gRT->GetVariable (\r
+ TCG2_VERSION_NAME,\r
+ &gTcg2ConfigFormSetGuid,\r
+ NULL,\r
+ &DataSize,\r
+ &Tcg2Version\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // EFI variable does exist and validate current setting.\r
+ //\r
+ ActionFlag = HiiValidateSettings (ConfigRequestHdr);\r
+ if (!ActionFlag) {\r
+ //\r
+ // Current configuration is invalid, reset to defaults.\r
+ //\r
+ ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
+ ASSERT (ActionFlag);\r
+ //\r
+ // Get the default values from variable.\r
+ //\r
+ DataSize = sizeof (Tcg2Version);\r
+ Status = gRT->GetVariable (\r
+ TCG2_VERSION_NAME,\r
+ &gTcg2ConfigFormSetGuid,\r
+ NULL,\r
+ &DataSize,\r
+ &Tcg2Version\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+ } else {\r
+ //\r
+ // EFI variable doesn't exist or variable size is not expected.\r
+ //\r
+\r
+ //\r
+ // Store zero data Buffer Storage to EFI variable.\r
+ //\r
+ Status = gRT->SetVariable (\r
+ TCG2_VERSION_NAME,\r
+ &gTcg2ConfigFormSetGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+ sizeof (Tcg2Version),\r
+ &Tcg2Version\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_VERSION_NAME\n"));\r
+ return;\r
+ } else {\r
+ //\r
+ // Build this variable based on default values stored in IFR.\r
+ //\r
+ ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
+ ASSERT (ActionFlag);\r
+ //\r
+ // Get the default values from variable.\r
+ //\r
+ DataSize = sizeof (Tcg2Version);\r
+ Status = gRT->GetVariable (\r
+ TCG2_VERSION_NAME,\r
+ &gTcg2ConfigFormSetGuid,\r
+ NULL,\r
+ &DataSize,\r
+ &Tcg2Version\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ if (PcdTcg2PpiVersion != Tcg2Version.PpiVersion) {\r
+ DEBUG ((DEBUG_WARN, "WARNING: PcdTcgPhysicalPresenceInterfaceVer default value is not same with the default value in VFR\n"));\r
+ DEBUG ((DEBUG_WARN, "WARNING: The default value in VFR has be chosen\n"));\r
+ }\r
+\r
+ if (PcdTpm2AcpiTableRev != Tcg2Version.Tpm2AcpiTableRev) {\r
+ DEBUG ((DEBUG_WARN, "WARNING: PcdTpm2AcpiTableRev default value is not same with the default value in VFR\n"));\r
+ DEBUG ((DEBUG_WARN, "WARNING: The default value in VFR has be chosen\n"));\r
}\r
- IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)((UINTN)IfrOpCodeHeader + IfrOpCodeHeader->Length);\r
}\r
- break;\r
}\r
- return ;\r
+\r
+ FreePool (ConfigRequestHdr);\r
+\r
+ //\r
+ // Get the PCD value again.\r
+ // If the PCD value is not equal to the value in variable,\r
+ // the PCD is not DynamicHii type and does not map to the setup option.\r
+ //\r
+ PcdTcg2PpiVersion = 0;\r
+ CopyMem (\r
+ &PcdTcg2PpiVersion,\r
+ PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer),\r
+ AsciiStrSize ((CHAR8 *)PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer))\r
+ );\r
+ if (PcdTcg2PpiVersion != Tcg2Version.PpiVersion) {\r
+ DEBUG ((DEBUG_WARN, "WARNING: PcdTcgPhysicalPresenceInterfaceVer is not DynamicHii type and does not map to TCG2_VERSION.PpiVersion\n"));\r
+ DEBUG ((DEBUG_WARN, "WARNING: The TCG2 PPI version configuring from setup page will not work\n"));\r
+ }\r
+\r
+ switch (PcdTcg2PpiVersion) {\r
+ case TCG2_PPI_VERSION_1_2:\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_PPI_VERSION_STATE_CONTENT), L"1.2", NULL);\r
+ break;\r
+ case TCG2_PPI_VERSION_1_3:\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_PPI_VERSION_STATE_CONTENT), L"1.3", NULL);\r
+ break;\r
+ default:\r
+ ASSERT (FALSE);\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Get the PcdTpm2AcpiTableRev value again.\r
+ // If the PCD value is not equal to the value in variable,\r
+ // the PCD is not DynamicHii type and does not map to TCG2_VERSION Variable.\r
+ //\r
+ PcdTpm2AcpiTableRev = PcdGet8 (PcdTpm2AcpiTableRev);\r
+ if (PcdTpm2AcpiTableRev != Tcg2Version.Tpm2AcpiTableRev) {\r
+ DEBUG ((DEBUG_WARN, "WARNING: PcdTpm2AcpiTableRev is not DynamicHii type and does not map to TCG2_VERSION.Tpm2AcpiTableRev\n"));\r
+ DEBUG ((DEBUG_WARN, "WARNING: The Tpm2 ACPI Revision configuring from setup page will not work\n"));\r
+ }\r
+\r
+ switch (PcdTpm2AcpiTableRev) {\r
+ case EFI_TPM2_ACPI_TABLE_REVISION_3:\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_REVISION_STATE_CONTENT), L"Rev 3", NULL);\r
+ break;\r
+ case EFI_TPM2_ACPI_TABLE_REVISION_4:\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_REVISION_STATE_CONTENT), L"Rev 4", NULL);\r
+ break;\r
+ default:\r
+ ASSERT (FALSE);\r
+ break;\r
+ }\r
}\r
\r
/**\r
\r
@retval EFI_ALREADY_STARTED The driver already exists in system.\r
@retval EFI_OUT_OF_RESOURCES Fail to execute entry point due to lack of resources.\r
- @retval EFI_SUCCES All the related protocols are installed on the driver.\r
+ @retval EFI_SUCCESS All the related protocols are installed on the driver.\r
@retval Others Fail to install protocols as indicated.\r
\r
**/\r
EFI_STATUS\r
EFIAPI\r
Tcg2ConfigDriverEntryPoint (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
EFI_STATUS Status;\r
if (!EFI_ERROR (Status)) {\r
return EFI_ALREADY_STARTED;\r
}\r
- \r
+\r
//\r
// Create a private data structure.\r
//\r
mTcg2ConfigPrivateDate = PrivateData;\r
//\r
// Install private GUID.\r
- // \r
+ //\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&ImageHandle,\r
&gEfiCallerIdGuid,\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) &PrivateData->Tcg2Protocol);\r
+ Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **)&PrivateData->Tcg2Protocol);\r
ASSERT_EFI_ERROR (Status);\r
\r
- PrivateData->ProtocolCapability.Size = sizeof(PrivateData->ProtocolCapability);\r
- Status = PrivateData->Tcg2Protocol->GetCapability (\r
- PrivateData->Tcg2Protocol,\r
- &PrivateData->ProtocolCapability\r
- );\r
+ PrivateData->ProtocolCapability.Size = sizeof (PrivateData->ProtocolCapability);\r
+ Status = PrivateData->Tcg2Protocol->GetCapability (\r
+ PrivateData->Tcg2Protocol,\r
+ &PrivateData->ProtocolCapability\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
\r
- DataSize = sizeof(Tcg2Configuration);\r
- Status = gRT->GetVariable (\r
- TCG2_STORAGE_NAME,\r
- &gTcg2ConfigFormSetGuid,\r
- NULL,\r
- &DataSize,\r
- &Tcg2Configuration\r
- );\r
+ DataSize = sizeof (Tcg2Configuration);\r
+ Status = gRT->GetVariable (\r
+ TCG2_STORAGE_NAME,\r
+ &gTcg2ConfigFormSetGuid,\r
+ NULL,\r
+ &DataSize,\r
+ &Tcg2Configuration\r
+ );\r
if (EFI_ERROR (Status)) {\r
//\r
// Variable not ready, set default value\r
//\r
- Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
+ Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
}\r
\r
//\r
// Validation\r
//\r
if ((Tcg2Configuration.TpmDevice > TPM_DEVICE_MAX) || (Tcg2Configuration.TpmDevice < TPM_DEVICE_MIN)) {\r
- Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
+ Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
}\r
\r
//\r
Status = PrivateData->Tcg2Protocol->GetActivePcrBanks (PrivateData->Tcg2Protocol, &CurrentActivePCRBanks);\r
ASSERT_EFI_ERROR (Status);\r
PrivateData->PCRBanksDesired = CurrentActivePCRBanks;\r
- UpdateDefaultPCRBanks (Tcg2ConfigBin + sizeof(UINT32), ReadUnaligned32((UINT32 *)Tcg2ConfigBin) - sizeof(UINT32), CurrentActivePCRBanks);\r
-\r
- //\r
- // Save to variable so platform driver can get it.\r
- //\r
- Status = gRT->SetVariable (\r
- TCG2_STORAGE_NAME,\r
- &gTcg2ConfigFormSetGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof(Tcg2Configuration),\r
- &Tcg2Configuration\r
- );\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_NAME\n"));\r
- }\r
+ UpdateDefaultPCRBanks (Tcg2ConfigBin + sizeof (UINT32), ReadUnaligned32 ((UINT32 *)Tcg2ConfigBin) - sizeof (UINT32), CurrentActivePCRBanks);\r
\r
//\r
// Sync data from PCD to variable, so that we do not need detect again in S3 phase.\r
//\r
Tcg2DeviceDetection.TpmDeviceDetected = TPM_DEVICE_NULL;\r
- for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) {\r
- if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) {\r
+ for (Index = 0; Index < sizeof (mTpmInstanceId)/sizeof (mTpmInstanceId[0]); Index++) {\r
+ if (CompareGuid (PcdGetPtr (PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) {\r
Tcg2DeviceDetection.TpmDeviceDetected = mTpmInstanceId[Index].TpmDevice;\r
break;\r
}\r
}\r
\r
PrivateData->TpmDeviceDetected = Tcg2DeviceDetection.TpmDeviceDetected;\r
+ Tcg2Configuration.TpmDevice = Tcg2DeviceDetection.TpmDeviceDetected;\r
\r
//\r
// Save to variable so platform driver can get it.\r
TCG2_DEVICE_DETECTION_NAME,\r
&gTcg2ConfigFormSetGuid,\r
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof(Tcg2DeviceDetection),\r
+ sizeof (Tcg2DeviceDetection),\r
&Tcg2DeviceDetection\r
);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_DEVICE_DETECTION_NAME\n"));\r
+ DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_DEVICE_DETECTION_NAME\n"));\r
Status = gRT->SetVariable (\r
TCG2_DEVICE_DETECTION_NAME,\r
&gTcg2ConfigFormSetGuid,\r
ASSERT_EFI_ERROR (Status);\r
}\r
\r
+ //\r
+ // Save to variable so platform driver can get it.\r
+ //\r
+ Status = gRT->SetVariable (\r
+ TCG2_STORAGE_NAME,\r
+ &gTcg2ConfigFormSetGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+ sizeof (Tcg2Configuration),\r
+ &Tcg2Configuration\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_NAME\n"));\r
+ }\r
+\r
//\r
// We should lock Tcg2DeviceDetection, because it contains information needed at S3.\r
//\r
);\r
ASSERT_EFI_ERROR (Status);\r
}\r
- \r
+\r
//\r
// Install Tcg2 configuration form\r
//\r
goto ErrorExit;\r
}\r
\r
+ InitializeTcg2VersionInfo (PrivateData);\r
+\r
return EFI_SUCCESS;\r
\r
ErrorExit:\r
if (PrivateData != NULL) {\r
UninstallTcg2ConfigForm (PrivateData);\r
- } \r
- \r
+ }\r
+\r
return Status;\r
}\r
\r
IN EFI_HANDLE ImageHandle\r
)\r
{\r
- EFI_STATUS Status;\r
- TCG2_CONFIG_PRIVATE_DATA *PrivateData;\r
+ EFI_STATUS Status;\r
+ TCG2_CONFIG_PRIVATE_DATA *PrivateData;\r
\r
Status = gBS->HandleProtocol (\r
ImageHandle,\r
&gEfiCallerIdGuid,\r
- (VOID **) &PrivateData\r
- ); \r
+ (VOID **)&PrivateData\r
+ );\r
if (EFI_ERROR (Status)) {\r
- return Status; \r
+ return Status;\r
}\r
- \r
+\r
ASSERT (PrivateData->Signature == TCG2_CONFIG_PRIVATE_DATA_SIGNATURE);\r
\r
gBS->UninstallMultipleProtocolInterfaces (\r
- &ImageHandle,\r
+ ImageHandle,\r
&gEfiCallerIdGuid,\r
PrivateData,\r
NULL\r
);\r
- \r
+\r
UninstallTcg2ConfigForm (PrivateData);\r
\r
return EFI_SUCCESS;\r