#include <Ppi/MfgMemoryTest.h>\r
#include <Guid/SetupVariable.h>\r
#include <Guid/Vlv2Variable.h>\r
+#include <Ppi/fTPMPolicy.h>\r
\r
//\r
// Start::Alpine Valley platform\r
UINT8 *Buffer\r
);\r
\r
+\r
+/**\r
+\r
+ Detemine Turbot board \r
+ @return 0: Not Turbot board\r
+ 1: Turbot board \r
+\r
+**/\r
+UINT32 \r
+DetermineTurbotBoard (\r
+ void\r
+ )\r
+{\r
+ UINTN PciD31F0RegBase = 0;\r
+ UINT32 GpioValue = 0;\r
+ UINT32 TmpVal = 0;\r
+ UINT32 MmioConf0 = 0;\r
+ UINT32 MmioPadval = 0;\r
+ UINT32 PConf0Offset = 0x200; //GPIO_S5_4 pad_conf0 register offset\r
+ UINT32 PValueOffset = 0x208; //GPIO_S5_4 pad_value register offset\r
+ UINT32 SSUSOffset = 0x2000;\r
+ UINT32 IoBase = 0;\r
+\r
+ DEBUG ((EFI_D_ERROR, "DetermineTurbotBoard() Entry\n"));\r
+ PciD31F0RegBase = MmPciAddress (0,\r
+ 0,\r
+ PCI_DEVICE_NUMBER_PCH_LPC,\r
+ PCI_FUNCTION_NUMBER_PCH_LPC,\r
+ 0\r
+ );\r
+ IoBase = MmioRead32 (PciD31F0RegBase + R_PCH_LPC_IO_BASE) & B_PCH_LPC_IO_BASE_BAR;\r
+ \r
+ MmioConf0 = IoBase + SSUSOffset + PConf0Offset;\r
+ MmioPadval = IoBase + SSUSOffset + PValueOffset;\r
+ //0xFED0E200/0xFED0E208 is pad_Conf/pad_val register address of GPIO_S5_4\r
+ DEBUG ((EFI_D_ERROR, "MmioConf0[0x%x], MmioPadval[0x%x]\n", MmioConf0, MmioPadval));\r
+ \r
+ MmioWrite32 (MmioConf0, 0x2003CC00); \r
+\r
+ TmpVal = MmioRead32 (MmioPadval);\r
+ TmpVal &= ~0x6; //Clear bit 1:2\r
+ TmpVal |= 0x2; // Set the pin as GPI\r
+ MmioWrite32 (MmioPadval, TmpVal); \r
+\r
+ GpioValue = MmioRead32 (MmioPadval);\r
+\r
+ DEBUG ((EFI_D_ERROR, "Gpio_S5_4 value is 0x%x\n", GpioValue));\r
+ return (GpioValue & 0x1);\r
+}\r
+\r
+\r
+\r
+EFI_STATUS\r
+FtpmPolicyInit (\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN SYSTEM_CONFIGURATION *pSystemConfiguration\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_PEI_PPI_DESCRIPTOR *mFtpmPolicyPpiDesc;\r
+ SEC_FTPM_POLICY_PPI *mFtpmPolicyPpi;\r
+\r
+\r
+ DEBUG((EFI_D_INFO, "FtpmPolicyInit Entry \n"));\r
+\r
+ if (NULL == PeiServices || NULL == pSystemConfiguration) {\r
+ DEBUG((EFI_D_ERROR, "Input error. \n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ \r
+ Status = (*PeiServices)->AllocatePool(\r
+ PeiServices,\r
+ sizeof (EFI_PEI_PPI_DESCRIPTOR),\r
+ (void **)&mFtpmPolicyPpiDesc\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = (*PeiServices)->AllocatePool(\r
+ PeiServices,\r
+ sizeof (SEC_FTPM_POLICY_PPI),\r
+ (void **)&mFtpmPolicyPpi\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Initialize PPI\r
+ //\r
+ (*PeiServices)->SetMem ((VOID *)mFtpmPolicyPpi, sizeof (SEC_FTPM_POLICY_PPI), 0);\r
+ mFtpmPolicyPpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;\r
+ mFtpmPolicyPpiDesc->Guid = &gSeCfTPMPolicyPpiGuid;\r
+ mFtpmPolicyPpiDesc->Ppi = mFtpmPolicyPpi;\r
+\r
+\r
+ DEBUG((EFI_D_INFO, "pSystemConfiguration->fTPM = 0x%x \n", pSystemConfiguration->fTPM)); \r
+ if(pSystemConfiguration->fTPM == 1) {\r
+ mFtpmPolicyPpi->fTPMEnable = TRUE;\r
+ } else {\r
+ mFtpmPolicyPpi->fTPMEnable = FALSE;\r
+ }\r
+\r
+ Status = (*PeiServices)->InstallPpi(\r
+ PeiServices,\r
+ mFtpmPolicyPpiDesc\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ DEBUG((EFI_D_INFO, "FtpmPolicyInit done \n"));\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
/**\r
This routine attempts to acquire the SMBus\r
\r
&VariableSize,\r
&SystemConfiguration\r
);\r
- ASSERT_EFI_ERROR(Status);\r
+ if (EFI_ERROR (Status) || VariableSize != sizeof(SYSTEM_CONFIGURATION)) {\r
+ //The setup variable is corrupted\r
+ VariableSize = sizeof(SYSTEM_CONFIGURATION);\r
+ Status = Variable->GetVariable(\r
+ Variable,\r
+ L"SetupRecovery",\r
+ &gEfiSetupVariableGuid,\r
+ NULL,\r
+ &VariableSize,\r
+ &SystemConfiguration\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+ \r
if (EFI_ERROR (Status)) {\r
GGC = ((2 << 3) | 0x200);\r
PciCfg16Write(EC_BASE, 0, 2, 0, 0x50, GGC);\r
);\r
\r
\r
+#ifdef FTPM_ENABLE\r
+ Status = FtpmPolicyInit(PeiServices, &SystemConfiguration);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG((EFI_D_ERROR, "fTPM init failed.\n"));\r
+ }\r
+#endif\r
+\r
+\r
//\r
// Set the new boot mode for MRC\r
//\r
UINTN DataSize;\r
EFI_PLATFORM_INFO_HOB TmpHob;\r
EFI_PEI_READ_ONLY_VARIABLE2_PPI *PeiVar;\r
+ UINT32 CompatibleBoard = 0; \r
\r
Status = (**PeiServices).LocatePpi (\r
PeiServices,\r
return Status;\r
}\r
\r
-\r
- PlatformInfoHob->BoardId = BOARD_ID_MINNOW2;\r
- DEBUG ((EFI_D_INFO, "I'm Minnow2!\n"));\r
+ CompatibleBoard = DetermineTurbotBoard();\r
+ if (1 == CompatibleBoard) {\r
+ PlatformInfoHob->BoardId = BOARD_ID_MINNOW2_TURBOT;\r
+ DEBUG ((EFI_D_INFO, "I'm MinnowBoard Turbot!\n"));\r
+ } else { \r
+ PlatformInfoHob->BoardId = BOARD_ID_MINNOW2;\r
+ DEBUG ((EFI_D_INFO, "I'm MinnowBoard Max!\n"));\r
+ }\r
+ \r
\r
PlatformInfoHob->MemCfgID = 0;\r
PlatformInfoHob->BoardRev = FabId + 1; // FabId = 0 means FAB1 (BoardRev = 1), FabId = 1 means FAB2 (BoardRev = 2)...\r