EFI_STATUS Status;\r
TREE_CONFIG_PRIVATE_DATA *PrivateData;\r
TREE_CONFIGURATION TrEEConfiguration;\r
+ TREE_DEVICE_DETECTION TrEEDeviceDetection;\r
UINTN Index;\r
UINTN DataSize;\r
+ EDKII_VARIABLE_LOCK_PROTOCOL *VariableLockProtocol;\r
\r
Status = gBS->OpenProtocol (\r
ImageHandle,\r
&TrEEConfiguration\r
);\r
if (EFI_ERROR (Status)) {\r
+ //\r
+ // Variable not ready, set default value\r
+ //\r
+ TrEEConfiguration.TpmDevice = TPM_DEVICE_DEFAULT;\r
}\r
+\r
//\r
- // We should always reinit PP request.\r
+ // Validation\r
//\r
- TrEEConfiguration.Tpm2Operation = TREE_PHYSICAL_PRESENCE_NO_ACTION;\r
+ if ((TrEEConfiguration.TpmDevice > TPM_DEVICE_MAX) || (TrEEConfiguration.TpmDevice < TPM_DEVICE_MIN)) {\r
+ TrEEConfiguration.TpmDevice = TPM_DEVICE_DEFAULT;\r
+ }\r
\r
//\r
- // Sync data from PCD to variable, so that we do not need detect again in S3 phase.\r
+ // Save to variable so platform driver can get it.\r
//\r
+ Status = gRT->SetVariable (\r
+ TREE_STORAGE_NAME,\r
+ &gTrEEConfigFormSetGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+ sizeof(TrEEConfiguration),\r
+ &TrEEConfiguration\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((EFI_D_ERROR, "TrEEConfigDriver: Fail to set TREE_STORAGE_NAME\n"));\r
+ }\r
\r
//\r
- // Get data from PCD to make sure data consistant - platform driver is suppose to construct this PCD accroding to Variable\r
+ // Sync data from PCD to variable, so that we do not need detect again in S3 phase.\r
//\r
+ TrEEDeviceDetection.TpmDeviceDetected = TPM_DEVICE_NULL;\r
for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) {\r
if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) {\r
- TrEEConfiguration.TpmDevice = mTpmInstanceId[Index].TpmDevice;\r
+ TrEEDeviceDetection.TpmDeviceDetected = mTpmInstanceId[Index].TpmDevice;\r
break;\r
}\r
}\r
\r
+ PrivateData->TpmDeviceDetected = TrEEDeviceDetection.TpmDeviceDetected;\r
+\r
//\r
// Save to variable so platform driver can get it.\r
//\r
Status = gRT->SetVariable (\r
- TREE_STORAGE_NAME,\r
+ TREE_DEVICE_DETECTION_NAME,\r
&gTrEEConfigFormSetGuid,\r
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof(TrEEConfiguration),\r
- &TrEEConfiguration\r
+ sizeof(TrEEDeviceDetection),\r
+ &TrEEDeviceDetection\r
);\r
- ASSERT_EFI_ERROR (Status);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((EFI_D_ERROR, "TrEEConfigDriver: Fail to set TREE_DEVICE_DETECTION_NAME\n"));\r
+ Status = gRT->SetVariable (\r
+ TREE_DEVICE_DETECTION_NAME,\r
+ &gTrEEConfigFormSetGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+ 0,\r
+ NULL\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+\r
+ //\r
+ // We should lock TrEEDeviceDetection, because it contains information needed at S3.\r
+ //\r
+ Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLockProtocol);\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = VariableLockProtocol->RequestToLock (\r
+ VariableLockProtocol,\r
+ TREE_DEVICE_DETECTION_NAME,\r
+ &gTrEEConfigFormSetGuid\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
\r
//\r
// Install TrEE configuration form\r