/** The entry point for TrEE configuration driver. @param FileHandle Handle of the file being invoked. @param PeiServices Describes the list of possible PEI Services. @retval EFI_SUCCES Convert variable to PCD successfully. @retval Others Fail to convert variable to PCD. **/ EFI_STATUS EFIAPI TrEEConfigPeimEntryPoint ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) { UINTN Size; EFI_STATUS Status; EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariablePpi; TREE_CONFIGURATION TrEEConfiguration; UINTN Index; UINT8 TpmDevice; Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (VOID **) &VariablePpi); ASSERT_EFI_ERROR (Status); Size = sizeof(TrEEConfiguration); Status = VariablePpi->GetVariable ( VariablePpi, TREE_STORAGE_NAME, &gTrEEConfigFormSetGuid, NULL, &Size, &TrEEConfiguration ); if (EFI_ERROR (Status)) { // // Variable not ready, set default value // TrEEConfiguration.TpmDevice = TPM_DEVICE_DEFAULT; } // // Validation // if (TrEEConfiguration.TpmDevice > TPM_DEVICE_MAX) { TrEEConfiguration.TpmDevice = TPM_DEVICE_DEFAULT; } // // Although we have SetupVariable info, we still need detect TPM device manually. // DEBUG ((EFI_D_ERROR, "TrEEConfiguration.TpmDevice from Setup: %x\n", TrEEConfiguration.TpmDevice)); if (PcdGetBool (PcdTpmAutoDetection)) { TpmDevice = DetectTpmDevice (TrEEConfiguration.TpmDevice); DEBUG ((EFI_D_ERROR, "TrEEConfiguration.TpmDevice final: %x\n", TpmDevice)); TrEEConfiguration.TpmDevice = TpmDevice; } // // Convert variable to PCD. // This is work-around because there is no gurantee DynamicHiiPcd can return correct value in DXE phase. // Using DynamicPcd instead. // for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) { if (TrEEConfiguration.TpmDevice == mTpmInstanceId[Index].TpmDevice) { Size = sizeof(mTpmInstanceId[Index].TpmInstanceGuid); PcdSetPtr (PcdTpmInstanceGuid, &Size, &mTpmInstanceId[Index].TpmInstanceGuid); DEBUG ((EFI_D_ERROR, "TrEEConfiguration.TpmDevice PCD: %g\n", &mTpmInstanceId[Index].TpmInstanceGuid)); break; } } // // Selection done // Status = PeiServicesInstallPpi (&gTpmSelectedPpi); ASSERT_EFI_ERROR (Status); return Status; }
/** The entry point for TrEE configuration driver. @param FileHandle Handle of the file being invoked. @param PeiServices Describes the list of possible PEI Services. @retval EFI_SUCCES Convert variable to PCD successfully. @retval Others Fail to convert variable to PCD. **/ EFI_STATUS EFIAPI TrEEConfigPeimEntryPoint ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) { UINTN Size; EFI_STATUS Status; EFI_STATUS Status2; EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariablePpi; TREE_CONFIGURATION TrEEConfiguration; UINTN Index; UINT8 TpmDevice; Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (VOID **) &VariablePpi); ASSERT_EFI_ERROR (Status); Size = sizeof(TrEEConfiguration); Status = VariablePpi->GetVariable ( VariablePpi, TREE_STORAGE_NAME, &gTrEEConfigFormSetGuid, NULL, &Size, &TrEEConfiguration ); if (EFI_ERROR (Status)) { // // Variable not ready, set default value // TrEEConfiguration.TpmDevice = TPM_DEVICE_DEFAULT; } // // Validation // if ((TrEEConfiguration.TpmDevice > TPM_DEVICE_MAX) || (TrEEConfiguration.TpmDevice < TPM_DEVICE_MIN)) { TrEEConfiguration.TpmDevice = TPM_DEVICE_DEFAULT; } // // Although we have SetupVariable info, we still need detect TPM device manually. // DEBUG ((EFI_D_INFO, "TrEEConfiguration.TpmDevice from Setup: %x\n", TrEEConfiguration.TpmDevice)); if (PcdGetBool (PcdTpmAutoDetection)) { TpmDevice = DetectTpmDevice (TrEEConfiguration.TpmDevice); DEBUG ((EFI_D_INFO, "TpmDevice final: %x\n", TpmDevice)); if (TpmDevice != TPM_DEVICE_NULL) { TrEEConfiguration.TpmDevice = TpmDevice; } } else { TpmDevice = TrEEConfiguration.TpmDevice; } // // Convert variable to PCD. // This is work-around because there is no gurantee DynamicHiiPcd can return correct value in DXE phase. // Using DynamicPcd instead. // // NOTE: TrEEConfiguration variable contains the desired TpmDevice type, // while PcdTpmInstanceGuid PCD contains the real detected TpmDevice type // for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) { if (TpmDevice == mTpmInstanceId[Index].TpmDevice) { Size = sizeof(mTpmInstanceId[Index].TpmInstanceGuid); Status = PcdSetPtrS (PcdTpmInstanceGuid, &Size, &mTpmInstanceId[Index].TpmInstanceGuid); ASSERT_EFI_ERROR (Status); DEBUG ((EFI_D_INFO, "TpmDevice PCD: %g\n", &mTpmInstanceId[Index].TpmInstanceGuid)); break; } } // // Selection done // Status = PeiServicesInstallPpi (&gTpmSelectedPpi); ASSERT_EFI_ERROR (Status); // // Even if no TPM is selected or detected, we still need intall TpmInitializationDonePpi. // Because TcgPei or TrEEPei will not run, but we still need a way to notify other driver. // Other driver can know TPM initialization state by TpmInitializedPpi. // if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &gEfiTpmDeviceInstanceNoneGuid)) { Status2 = PeiServicesInstallPpi (&mTpmInitializationDonePpiList); ASSERT_EFI_ERROR (Status2); } return Status; }