]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Vlv2TbltDevicePkg/PlatformPei/Platform.c
SecurityPkg: Add DEBUG messages for TPM2Startup
[mirror_edk2.git] / Vlv2TbltDevicePkg / PlatformPei / Platform.c
index 1dab9ca851c6b9ae7f41f095adbbe78d45d35a3a..b0ab3e1c98409e7a116f37817fe22a8ee98bffef 100644 (file)
@@ -28,6 +28,7 @@ Module Name:
 #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
@@ -190,6 +191,118 @@ PeiSmbusExec (
   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
@@ -654,7 +767,20 @@ PeiInitPlatform (
                        &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
@@ -697,6 +823,14 @@ PeiInitPlatform (
     );\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
@@ -771,6 +905,7 @@ ReadPlatformIds (
     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
@@ -799,9 +934,15 @@ ReadPlatformIds (
       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