Home | History | Annotate | Download | only in PlatformDxe
      1 /** @file
      2 
      3   Copyright (c) 2004  - 2015, Intel Corporation. All rights reserved.<BR>
      4 
      5 
      6   This program and the accompanying materials are licensed and made available under
      7 
      8   the terms and conditions of the BSD License that accompanies this distribution.
      9 
     10   The full text of the license may be found at
     11 
     12   http://opensource.org/licenses/bsd-license.php.
     13 
     14 
     15 
     16   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     17 
     18   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     19 
     20 
     21 
     22 
     23 Module Name:
     24 
     25 
     26   Platform.c
     27 
     28 Abstract:
     29 
     30   Platform Initialization Driver.
     31 
     32 
     33 --*/
     34 
     35 #include "PlatformDxe.h"
     36 #include "Platform.h"
     37 #include "PchCommonDefinitions.h"
     38 #include <Protocol/UsbPolicy.h>
     39 #include <Protocol/PchPlatformPolicy.h>
     40 #include <Protocol/TpmMp.h>
     41 #include <Protocol/CpuIo2.h>
     42 #include <Library/S3BootScriptLib.h>
     43 #include <Guid/PciLanInfo.h>
     44 #include <Guid/ItkData.h>
     45 #include <Library/PciLib.h>
     46 #include <PlatformBootMode.h>
     47 #include <Guid/EventGroup.h>
     48 #include <Guid/Vlv2Variable.h>
     49 #include <Protocol/GlobalNvsArea.h>
     50 #include <Protocol/IgdOpRegion.h>
     51 #include <Library/PcdLib.h>
     52 #include <Protocol/VariableLock.h>
     53 
     54 
     55 //
     56 // VLV2 GPIO GROUP OFFSET
     57 //
     58 #define GPIO_SCORE_OFFSET	0x0000
     59 #define GPIO_NCORE_OFFSET	0x1000
     60 #define GPIO_SSUS_OFFSET	0x2000
     61 
     62 typedef struct {
     63   UINT32 offset;
     64   UINT32 val;
     65 } CFIO_PNP_INIT;
     66 
     67 GPIO_CONF_PAD_INIT mTB_BL_GpioInitData_SC_TRI_Exit_boot_Service[] =
     68 {
     69 //              Pad Name          GPIO Number     Used As   GPO Default  Function#     INT Capable   Interrupt Type   PULL H/L    MMIO Offset
     70   GPIO_INIT_ITEM("LPC_CLKOUT0       GPIOC_47 "     ,TRISTS   ,NA           ,F0           ,             ,                ,NONE       ,0x47),
     71   GPIO_INIT_ITEM("LPC_CLKOUT1       GPIOC_48 "     ,TRISTS   ,NA           ,F0           ,             ,                ,NONE       ,0x41),
     72 };
     73 
     74 
     75 EFI_GUID mSystemHiiExportDatabase = EFI_HII_EXPORT_DATABASE_GUID;
     76 EFI_GUID mPlatformDriverGuid = EFI_PLATFORM_DRIVER_GUID;
     77 SYSTEM_CONFIGURATION  mSystemConfiguration;
     78 SYSTEM_PASSWORDS      mSystemPassword;
     79 EFI_HANDLE            mImageHandle;
     80 BOOLEAN               mMfgMode = FALSE;
     81 VOID                  *mDxePlatformStringPack;
     82 UINT32                mPlatformBootMode = PLATFORM_NORMAL_MODE;
     83 extern CHAR16 gItkDataVarName[];
     84 
     85 
     86 EFI_PLATFORM_INFO_HOB      mPlatformInfo;
     87 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *mPciRootBridgeIo;
     88 EFI_EVENT  mReadyToBootEvent;
     89 
     90 UINT8 mSmbusRsvdAddresses[] = PLATFORM_SMBUS_RSVD_ADDRESSES;
     91 UINT8 mNumberSmbusAddress = sizeof( mSmbusRsvdAddresses ) / sizeof( mSmbusRsvdAddresses[0] );
     92 UINT32 mSubsystemVidDid;
     93 UINT32 mSubsystemAudioVidDid;
     94 
     95 UINTN   mPciLanCount = 0;
     96 VOID    *mPciLanInfo = NULL;
     97 UINTN   SpiBase;
     98 
     99 static EFI_SPEAKER_IF_PROTOCOL mSpeakerInterface = {
    100   ProgramToneFrequency,
    101   GenerateBeepTone
    102 };
    103 
    104 EFI_USB_POLICY_PROTOCOL         mUsbPolicyData = {0};
    105 
    106 
    107 CFIO_PNP_INIT mTB_BL_GpioInitData_SC_TRI_S0ix_Exit_boot_Service[] =
    108 {
    109   {0x410 ,0x20038e10},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_clkout1_pconf0
    110   {0x470 ,0x20038e10},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_clkout0_pconf0
    111   {0x560 ,0x20038e10},  //vlv.gpio.gpscore.cfio_regs_pad_ilb_serirq_pconf0
    112   {0x450 ,0x20038e10},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_frameb_pconf0
    113   {0x480 ,0x20038e10},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_clkrunb_pconf0
    114   {0x420 ,0x20038e10},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_ad3_pconf0
    115   {0x430 ,0x20038e10},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_ad2_pconf0
    116   {0x440 ,0x20038e10},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_ad1_pconf0
    117   {0x460 ,0x20038e10},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_ad0_pconf0
    118   {0x418 ,0x00000006},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_clkout1_pad_val
    119   {0x478 ,0x00000006},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_clkout0_pad_val
    120   {0x568 ,0x00000006},  //vlv.gpio.gpscore.cfio_regs_pad_ilb_serirq_pad_val
    121   {0x458 ,0x00000006},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_frameb_pad_val
    122   {0x488 ,0x00000006},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_clkrunb_pad_val
    123   {0x428 ,0x00000006},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_ad3_pad_val
    124   {0x438 ,0x00000006},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_ad2_pad_val
    125   {0x448 ,0x00000006},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_ad1_pad_val
    126   {0x468 ,0x00000006},  //vlv.gpio.gpscore.cfio_regs_pad_lpc_ad0_pad_val
    127 };
    128 
    129 VOID
    130 EfiOrMem (
    131   IN VOID   *Destination,
    132   IN VOID   *Source,
    133   IN UINTN  Length
    134   );
    135 
    136 #if defined(FIRMWARE_ID_BACKWARD_COMPATIBLE) && (FIRMWARE_ID_BACKWARD_COMPATIBLE != 0)
    137 STATIC
    138 VOID
    139 InitFirmwareId();
    140 #endif
    141 
    142 
    143 VOID
    144 InitializeClockRouting(
    145   );
    146 
    147 VOID
    148 InitializeSlotInfo (
    149   );
    150 
    151 #if defined(SENSOR_INFO_VAR_SUPPORT) && SENSOR_INFO_VAR_SUPPORT != 0
    152 VOID
    153 InitializeSensorInfoVariable (
    154   );
    155 #endif
    156 
    157 VOID
    158 InitTcoReset (
    159   );
    160 
    161 VOID
    162 InitExI ();
    163 
    164 VOID
    165 InitItk();
    166 
    167 VOID
    168 InitPlatformBootMode();
    169 
    170 VOID
    171 InitMfgAndConfigModeStateVar();
    172 
    173 VOID
    174 InitPchPlatformPolicy (
    175   IN EFI_PLATFORM_INFO_HOB      *PlatformInfo
    176   );
    177 
    178 VOID
    179 InitVlvPlatformPolicy (
    180   );
    181 
    182 VOID
    183 InitSioPlatformPolicy(
    184   );
    185 
    186 VOID
    187 PchInitBeforeBoot(
    188   );
    189 
    190 VOID
    191 UpdateDVMTSetup(
    192   );
    193 
    194 VOID
    195 InitPlatformUsbPolicy (
    196   VOID
    197   );
    198 
    199 VOID
    200 InitRC6Policy(
    201   VOID
    202   );
    203 
    204 
    205 EFI_STATUS
    206 EFIAPI
    207 SaveSetupRecoveryVar(
    208   VOID
    209   )
    210 {
    211   EFI_STATUS                   Status = EFI_SUCCESS;
    212   UINTN                        SizeOfNvStore = 0;
    213   UINTN                        SizeOfSetupVar = 0;
    214   SYSTEM_CONFIGURATION         *SetupData = NULL;
    215   SYSTEM_CONFIGURATION         *RecoveryNvData = NULL;
    216   EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock = NULL;
    217 
    218 
    219   DEBUG ((EFI_D_INFO, "SaveSetupRecoveryVar() Entry \n"));
    220   SizeOfNvStore = sizeof(SYSTEM_CONFIGURATION);
    221   RecoveryNvData = AllocateZeroPool (sizeof(SYSTEM_CONFIGURATION));
    222   if (NULL == RecoveryNvData) {
    223     Status = EFI_OUT_OF_RESOURCES;
    224     goto Exit;
    225   }
    226 
    227   Status = gRT->GetVariable(
    228                 L"SetupRecovery",
    229                 &gEfiNormalSetupGuid,
    230                 NULL,
    231                 &SizeOfNvStore,
    232                 RecoveryNvData
    233                 );
    234 
    235   if (EFI_ERROR (Status)) {
    236     // Don't find the "SetupRecovery" variable.
    237     // have to copy "Setup" variable to "SetupRecovery" variable.
    238     SetupData = AllocateZeroPool (sizeof(SYSTEM_CONFIGURATION));
    239     if (NULL == SetupData) {
    240       Status = EFI_OUT_OF_RESOURCES;
    241       goto Exit;
    242     }
    243     SizeOfSetupVar = sizeof(SYSTEM_CONFIGURATION);
    244     Status = gRT->GetVariable(
    245                     NORMAL_SETUP_NAME,
    246                     &gEfiNormalSetupGuid,
    247                     NULL,
    248                     &SizeOfSetupVar,
    249                     SetupData
    250                     );
    251     ASSERT_EFI_ERROR (Status);
    252 
    253     Status = gRT->SetVariable (
    254                     L"SetupRecovery",
    255                     &gEfiNormalSetupGuid,
    256                     EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
    257                     sizeof(SYSTEM_CONFIGURATION),
    258                     SetupData
    259                     );
    260     ASSERT_EFI_ERROR (Status);
    261 
    262     Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **) &VariableLock);
    263       if (!EFI_ERROR (Status)) {
    264         Status = VariableLock->RequestToLock (VariableLock, L"SetupRecovery", &gEfiNormalSetupGuid);
    265         ASSERT_EFI_ERROR (Status);
    266     }
    267 
    268   }
    269 
    270 Exit:
    271   if (RecoveryNvData)
    272     FreePool (RecoveryNvData);
    273   if (SetupData)
    274     FreePool (SetupData);
    275 
    276   return Status;
    277 
    278 }
    279 
    280 
    281 VOID
    282 TristateLpcGpioConfig (
    283   IN UINT32             Gpio_Mmio_Offset,
    284   IN UINT32             Gpio_Pin_Num,
    285   GPIO_CONF_PAD_INIT*   Gpio_Conf_Data
    286   )
    287 
    288 {
    289   UINT32    index;
    290   UINT32    mmio_conf0;
    291   UINT32    mmio_padval;
    292   PAD_CONF0 conf0_val;
    293   PAD_VAL   pad_val;
    294 
    295   //
    296   // GPIO WELL -- Memory base registers
    297   //
    298 
    299   //
    300   // A0 BIOS Spec doesn't mention it although X0 does. comment out now.
    301   // GPIO write 0x01001002 to IOBASE + Gpio_Mmio_Offset + 0x0900
    302   //
    303 
    304   for(index=0; index < Gpio_Pin_Num; index++)
    305   {
    306     //
    307     // Calculate the MMIO Address for specific GPIO pin CONF0 register pointed by index.
    308     //
    309     mmio_conf0 = IO_BASE_ADDRESS + Gpio_Mmio_Offset + R_PCH_CFIO_PAD_CONF0 + Gpio_Conf_Data[index].offset * 16;
    310     mmio_padval= IO_BASE_ADDRESS + Gpio_Mmio_Offset + R_PCH_CFIO_PAD_VAL   + Gpio_Conf_Data[index].offset * 16;
    311 
    312 #ifdef EFI_DEBUG
    313     DEBUG ((EFI_D_INFO, "%s, ", Gpio_Conf_Data[index].pad_name));
    314 
    315 #endif
    316     DEBUG ((EFI_D_INFO, "Usage = %d, Func# = %d, IntType = %d, Pull Up/Down = %d, MMIO Base = 0x%08x, ",
    317       Gpio_Conf_Data[index].usage,
    318       Gpio_Conf_Data[index].func,
    319       Gpio_Conf_Data[index].int_type,
    320       Gpio_Conf_Data[index].pull,
    321       mmio_conf0));
    322 
    323     //
    324     // Step 1: PadVal Programming
    325     //
    326     pad_val.dw = MmioRead32(mmio_padval);
    327 
    328     //
    329     // Config PAD_VAL only for GPIO (Non-Native) Pin
    330     //
    331     if(Native != Gpio_Conf_Data[index].usage)
    332     {
    333       pad_val.dw &= ~0x6; // Clear bits 1:2
    334       pad_val.dw |= (Gpio_Conf_Data[index].usage & 0x6);  // Set bits 1:2 according to PadVal
    335 
    336         //
    337         // set GPO default value
    338         //
    339         if(Gpio_Conf_Data[index].usage == GPO && Gpio_Conf_Data[index].gpod4 != NA)
    340         {
    341         pad_val.r.pad_val = Gpio_Conf_Data[index].gpod4;
    342         }
    343     }
    344 
    345 
    346     DEBUG ((EFI_D_INFO, "Set PAD_VAL = 0x%08x, ", pad_val.dw));
    347 
    348     MmioWrite32(mmio_padval, pad_val.dw);
    349 
    350     //
    351     // Step 2: CONF0 Programming
    352     // Read GPIO default CONF0 value, which is assumed to be default value after reset.
    353     //
    354     conf0_val.dw = MmioRead32(mmio_conf0);
    355 
    356     //
    357     // Set Function #
    358     //
    359     conf0_val.r.Func_Pin_Mux = Gpio_Conf_Data[index].func;
    360 
    361     if(GPO == Gpio_Conf_Data[index].usage)
    362     {
    363       //
    364       // If used as GPO, then internal pull need to be disabled
    365       //
    366       conf0_val.r.Pull_assign = 0;  // Non-pull
    367     }
    368     else
    369     {
    370       //
    371       // Set PullUp / PullDown
    372       //
    373       if(P_20K_H == Gpio_Conf_Data[index].pull)
    374       {
    375         conf0_val.r.Pull_assign = 0x1;  // PullUp
    376         conf0_val.r.Pull_strength = 0x2;// 20K
    377       }
    378       else if(P_20K_L == Gpio_Conf_Data[index].pull)
    379       {
    380         conf0_val.r.Pull_assign = 0x2;  // PullDown
    381         conf0_val.r.Pull_strength = 0x2;// 20K
    382       }
    383       else if(P_NONE == Gpio_Conf_Data[index].pull)
    384       {
    385         conf0_val.r.Pull_assign = 0;	// Non-pull
    386       }
    387       else
    388       {
    389         ASSERT(FALSE);  // Invalid value
    390       }
    391     }
    392 
    393     //
    394     // Set INT Trigger Type
    395     //
    396     conf0_val.dw &= ~0x0f000000;  // Clear bits 27:24
    397 
    398     //
    399     // Set INT Trigger Type
    400     //
    401     if(TRIG_ == Gpio_Conf_Data[index].int_type)
    402     {
    403       //
    404       // Interrupt not capable, clear bits 27:24
    405       //
    406     }
    407     else
    408     {
    409       conf0_val.dw |= (Gpio_Conf_Data[index].int_type & 0x0f)<<24;
    410     }
    411 
    412     DEBUG ((EFI_D_INFO, "Set CONF0 = 0x%08x\n", conf0_val.dw));
    413 
    414     //
    415     // Write back the targeted GPIO config value according to platform (board) GPIO setting
    416     //
    417     MmioWrite32 (mmio_conf0, conf0_val.dw);
    418   }
    419 
    420   // A0 BIOS Spec doesn't mention it although X0 does. comment out now.
    421   // GPIO SCORE write 0x01001002 to IOBASE + 0x0900
    422   //
    423 }
    424 
    425 VOID
    426 EFIAPI
    427 SpiBiosProtectionFunction(
    428   EFI_EVENT Event,
    429   VOID      *Context
    430   )
    431 {
    432 
    433   UINTN                             mPciD31F0RegBase;
    434   UINTN                             BiosFlaLower0;
    435   UINTN                             BiosFlaLimit0;
    436   UINTN                             BiosFlaLower1;
    437   UINTN                             BiosFlaLimit1;
    438 
    439 
    440   BiosFlaLower0 = PcdGet32(PcdFlashMicroCodeAddress)-PcdGet32(PcdFlashAreaBaseAddress);
    441   BiosFlaLimit0 = PcdGet32(PcdFlashMicroCodeSize)-1;
    442   #ifdef MINNOW2_FSP_BUILD
    443   BiosFlaLower1 = PcdGet32(PcdFlashFvFspBase)-PcdGet32(PcdFlashAreaBaseAddress);
    444   BiosFlaLimit1 = (PcdGet32(PcdFlashFvRecoveryBase)-PcdGet32(PcdFlashFvFspBase)+PcdGet32(PcdFlashFvRecoverySize))-1;
    445   #else
    446   BiosFlaLower1 = PcdGet32(PcdFlashFvMainBase)-PcdGet32(PcdFlashAreaBaseAddress);
    447   BiosFlaLimit1 = (PcdGet32(PcdFlashFvRecoveryBase)-PcdGet32(PcdFlashFvMainBase)+PcdGet32(PcdFlashFvRecoverySize))-1;
    448   #endif
    449 
    450 
    451   mPciD31F0RegBase = MmPciAddress (0,
    452                          DEFAULT_PCI_BUS_NUMBER_PCH,
    453                          PCI_DEVICE_NUMBER_PCH_LPC,
    454                          PCI_FUNCTION_NUMBER_PCH_LPC,
    455                          0
    456                        );
    457   SpiBase          = MmioRead32(mPciD31F0RegBase + R_PCH_LPC_SPI_BASE) & B_PCH_LPC_SPI_BASE_BAR;
    458 
    459   //
    460   //Set SMM_BWP, WPD and LE bit
    461   //
    462   MmioOr32 ((UINTN) (SpiBase + R_PCH_SPI_BCR), (UINT8) B_PCH_SPI_BCR_SMM_BWP);
    463   MmioAnd32 ((UINTN) (SpiBase + R_PCH_SPI_BCR), (UINT8)(~B_PCH_SPI_BCR_BIOSWE));
    464   MmioOr32 ((UINTN) (SpiBase + R_PCH_SPI_BCR), (UINT8) B_PCH_SPI_BCR_BLE);
    465 
    466   //
    467   //First check if FLOCKDN or PR0FLOCKDN is set. No action if either of them set already.
    468   //
    469   if( (MmioRead16(SpiBase + R_PCH_SPI_HSFS) & B_PCH_SPI_HSFS_FLOCKDN) != 0 ||
    470       (MmioRead32(SpiBase + R_PCH_SPI_IND_LOCK)& B_PCH_SPI_IND_LOCK_PR0) != 0) {
    471     //
    472     //Already locked. we could take no action here
    473     //
    474     DEBUG((EFI_D_INFO, "PR0 already locked down. Stop configuring PR0.\n"));
    475     return;
    476   }
    477 
    478   //
    479   //Set PR0
    480   //
    481   MmioOr32((UINTN)(SpiBase + R_PCH_SPI_PR0),
    482     B_PCH_SPI_PR0_RPE|B_PCH_SPI_PR0_WPE|\
    483     (B_PCH_SPI_PR0_PRB_MASK&(BiosFlaLower0>>12))|(B_PCH_SPI_PR0_PRL_MASK&(BiosFlaLimit0>>12)<<16));
    484 
    485   //
    486   //Set PR1
    487   //
    488 
    489   MmioOr32((UINTN)(SpiBase + R_PCH_SPI_PR1),
    490     B_PCH_SPI_PR1_RPE|B_PCH_SPI_PR1_WPE|\
    491     (B_PCH_SPI_PR1_PRB_MASK&(BiosFlaLower1>>12))|(B_PCH_SPI_PR1_PRL_MASK&(BiosFlaLimit1>>12)<<16));
    492 
    493   //
    494   //Lock down PRx
    495   //
    496   MmioOr16 ((UINTN) (SpiBase + R_PCH_SPI_HSFS), (UINT16) (B_PCH_SPI_HSFS_FLOCKDN));
    497 
    498   //
    499   // Verify if it's really locked.
    500   //
    501   if ((MmioRead16 (SpiBase + R_PCH_SPI_HSFS) & B_PCH_SPI_HSFS_FLOCKDN) == 0) {
    502     DEBUG((EFI_D_ERROR, "Failed to lock down PRx.\n"));
    503   }
    504   return;
    505 
    506 }
    507 
    508 VOID
    509 EFIAPI
    510 InitPciDevPME (
    511   EFI_EVENT  Event,
    512   VOID       *Context
    513   )
    514 {
    515   UINTN                  VarSize;
    516   EFI_STATUS             Status;
    517 
    518   VarSize = sizeof(SYSTEM_CONFIGURATION);
    519   Status = gRT->GetVariable(
    520                   NORMAL_SETUP_NAME,
    521                   &gEfiNormalSetupGuid,
    522                   NULL,
    523                   &VarSize,
    524                   &mSystemConfiguration
    525                   );
    526 
    527   //
    528   //Program HDA PME_EN
    529   //
    530   PchAzaliaPciCfg32Or (R_PCH_HDA_PCS, B_PCH_HDA_PCS_PMEE);
    531 
    532   //
    533   //Program SATA PME_EN
    534   //
    535   PchSataPciCfg32Or (R_PCH_SATA_PMCS, B_PCH_SATA_PMCS_PMEE);
    536 
    537   DEBUG ((EFI_D_INFO, "InitPciDevPME mSystemConfiguration.EhciPllCfgEnable = 0x%x \n",mSystemConfiguration.EhciPllCfgEnable));
    538  if (mSystemConfiguration.EhciPllCfgEnable != 1) {
    539   //
    540   //Program EHCI PME_EN
    541   //
    542   PchMmPci32Or (
    543     0,
    544     0,
    545     PCI_DEVICE_NUMBER_PCH_USB,
    546     PCI_FUNCTION_NUMBER_PCH_EHCI,
    547     R_PCH_EHCI_PWR_CNTL_STS,
    548     B_PCH_EHCI_PWR_CNTL_STS_PME_EN
    549     );
    550  }
    551    {
    552      UINTN                 EhciPciMmBase;
    553      UINT32                Buffer32 = 0;
    554 
    555     EhciPciMmBase = MmPciAddress (0,
    556                       0,
    557                       PCI_DEVICE_NUMBER_PCH_USB,
    558                       PCI_FUNCTION_NUMBER_PCH_EHCI,
    559                       0
    560                     );
    561     DEBUG ((EFI_D_INFO, "ConfigureAdditionalPm() EhciPciMmBase = 0x%x \n",EhciPciMmBase));
    562     Buffer32 = MmioRead32(EhciPciMmBase + R_PCH_EHCI_PWR_CNTL_STS);
    563     DEBUG ((EFI_D_INFO, "ConfigureAdditionalPm() R_PCH_EHCI_PWR_CNTL_STS = 0x%x \n",Buffer32));
    564   }
    565 }
    566 
    567 VOID
    568 EFIAPI
    569 InitThermalZone (
    570   EFI_EVENT  Event,
    571   VOID       *Context
    572   )
    573 {
    574   UINTN                  VarSize;
    575   EFI_STATUS             Status;
    576   EFI_GLOBAL_NVS_AREA_PROTOCOL       *GlobalNvsArea;
    577   VarSize = sizeof(SYSTEM_CONFIGURATION);
    578   Status = gRT->GetVariable(
    579                   NORMAL_SETUP_NAME,
    580                   &gEfiNormalSetupGuid,
    581                   NULL,
    582                   &VarSize,
    583                   &mSystemConfiguration
    584                   );
    585   Status = gBS->LocateProtocol (
    586                   &gEfiGlobalNvsAreaProtocolGuid,
    587                   NULL,
    588                   (void **)&GlobalNvsArea
    589                   );
    590   GlobalNvsArea->Area->CriticalThermalTripPoint = mSystemConfiguration.CriticalThermalTripPoint;
    591   GlobalNvsArea->Area->PassiveThermalTripPoint = mSystemConfiguration.PassiveThermalTripPoint;
    592 }
    593 #if defined SUPPORT_LVDS_DISPLAY && SUPPORT_LVDS_DISPLAY
    594 
    595 #endif
    596 
    597 
    598 EFI_STATUS
    599 EFIAPI
    600 TristateLpcGpioS0i3Config (
    601   UINT32             Gpio_Mmio_Offset,
    602   UINT32             Gpio_Pin_Num,
    603   CFIO_PNP_INIT*   Gpio_Conf_Data
    604   )
    605 {
    606 
    607   UINT32	  index;
    608   UINT32	  mmio_reg;
    609   UINT32	  mmio_val;
    610 
    611     DEBUG ((DEBUG_INFO, "TristateLpcGpioS0i3Config\n"));
    612 
    613     for(index=0; index < Gpio_Pin_Num; index++)
    614     {
    615       mmio_reg = IO_BASE_ADDRESS + Gpio_Mmio_Offset + Gpio_Conf_Data[index].offset;
    616 
    617       MmioWrite32(mmio_reg, Gpio_Conf_Data[index].val);
    618       mmio_val = 0;
    619       mmio_val = MmioRead32(mmio_reg);
    620 
    621       DEBUG ((EFI_D_INFO, "Set MMIO=0x%08x  PAD_VAL = 0x%08x,\n", mmio_reg, mmio_val));
    622     }
    623 
    624      return EFI_SUCCESS;
    625 }
    626 
    627 
    628 EFI_BOOT_SCRIPT_SAVE_PROTOCOL *mBootScriptSave;
    629 
    630 /**
    631   Event Notification during exit boot service to enabel ACPI mode
    632 
    633    Disable SW SMI Timer, SMI from USB & Intel Specific USB 2
    634 
    635    Clear all ACPI event status and disable all ACPI events
    636    Disable PM sources except power button
    637    Clear status bits
    638 
    639    Guarantee day-of-month alarm is invalid (ACPI 5.0 Section 4.8.2.4 "Real Time Clock Alarm")
    640 
    641    Update EC to disable SMI and enable SCI
    642 
    643    Enable SCI
    644 
    645    Enable PME_B0_EN in GPE0a_EN
    646 
    647   @param Event  - EFI Event Handle
    648   @param Context - Pointer to Notify Context
    649 
    650   @retval  Nothing
    651 
    652 **/
    653 VOID
    654 EFIAPI
    655 EnableAcpiCallback (
    656   IN EFI_EVENT        Event,
    657   IN VOID             *Context
    658   )
    659 {
    660   UINT32  RegData32;
    661   UINT16  Pm1Cnt;
    662   UINT16  AcpiBase;
    663   UINT32  Gpe0aEn;
    664 
    665   AcpiBase = MmioRead16 (
    666                PchPciDeviceMmBase (DEFAULT_PCI_BUS_NUMBER_PCH,
    667                PCI_DEVICE_NUMBER_PCH_LPC,
    668                PCI_FUNCTION_NUMBER_PCH_LPC) + R_PCH_LPC_ACPI_BASE
    669                ) & B_PCH_LPC_ACPI_BASE_BAR;
    670 
    671   DEBUG ((EFI_D_INFO, "EnableAcpiCallback: AcpiBase = %x\n", AcpiBase));
    672 
    673   //
    674   // Disable SW SMI Timer, SMI from USB & Intel Specific USB 2
    675   //
    676   RegData32 = IoRead32(AcpiBase + R_PCH_SMI_EN);
    677   RegData32 &= ~(B_PCH_SMI_EN_SWSMI_TMR | B_PCH_SMI_EN_LEGACY_USB2 | B_PCH_SMI_EN_INTEL_USB2);
    678   IoWrite32(AcpiBase + R_PCH_SMI_EN, RegData32);
    679 
    680   RegData32 = IoRead32(AcpiBase + R_PCH_SMI_STS);
    681   RegData32 |= B_PCH_SMI_STS_SWSMI_TMR;
    682   IoWrite32(AcpiBase + R_PCH_SMI_STS, RegData32);
    683 
    684   //
    685   // Disable PM sources except power button
    686   // power button is enabled only for PCAT. Disabled it on Tablet platform
    687   //
    688 
    689   IoWrite16(AcpiBase + R_PCH_ACPI_PM1_EN, B_PCH_ACPI_PM1_EN_PWRBTN);
    690   IoWrite16(AcpiBase + R_PCH_ACPI_PM1_STS, 0xffff);
    691 
    692   //
    693   // Guarantee day-of-month alarm is invalid (ACPI 5.0 Section 4.8.2.4 "Real Time Clock Alarm")
    694   // Clear Status D reg VM bit, Date of month Alarm to make Data in CMOS RAM is no longer Valid
    695   //
    696   IoWrite8 (PCAT_RTC_ADDRESS_REGISTER, RTC_ADDRESS_REGISTER_D);
    697   IoWrite8 (PCAT_RTC_DATA_REGISTER, 0x0);
    698 
    699   RegData32 = IoRead32(AcpiBase + R_PCH_ALT_GP_SMI_EN);
    700   RegData32 &= ~(BIT7);
    701   IoWrite32((AcpiBase + R_PCH_ALT_GP_SMI_EN), RegData32);
    702 
    703   //
    704   // Enable SCI
    705   //
    706   Pm1Cnt = IoRead16(AcpiBase + R_PCH_ACPI_PM1_CNT);
    707   Pm1Cnt |= B_PCH_ACPI_PM1_CNT_SCI_EN;
    708   IoWrite16(AcpiBase + R_PCH_ACPI_PM1_CNT, Pm1Cnt);
    709 
    710   IoWrite8(0x80, 0xA0);	//SW_SMI_ACPI_ENABLE
    711 
    712   //
    713   // Enable PME_B0_EN in GPE0a_EN
    714   // Caution: Enable PME_B0_EN must be placed after enabling SCI.
    715   // Otherwise, USB PME could not be handled as SMI event since no handler is there.
    716   //
    717   Gpe0aEn = IoRead32 (AcpiBase + R_PCH_ACPI_GPE0a_EN);
    718   Gpe0aEn |= B_PCH_ACPI_GPE0a_EN_PME_B0;
    719   IoWrite32(AcpiBase + R_PCH_ACPI_GPE0a_EN, Gpe0aEn);
    720 
    721 }
    722 
    723 /**
    724 
    725   Routine Description:
    726 
    727   This is the standard EFI driver point for the Driver. This
    728   driver is responsible for setting up any platform specific policy or
    729   initialization information.
    730 
    731   @param ImageHandle    Handle for the image of this driver.
    732   @param SystemTable    Pointer to the EFI System Table.
    733 
    734   @retval EFI_SUCCESS   Policy decisions set.
    735 
    736 **/
    737 EFI_STATUS
    738 EFIAPI
    739 InitializePlatform (
    740   IN EFI_HANDLE         ImageHandle,
    741   IN EFI_SYSTEM_TABLE   *SystemTable
    742   )
    743 {
    744   EFI_STATUS                          Status;
    745   UINTN                               VarSize;
    746   EFI_HANDLE                          Handle = NULL;
    747   EFI_EVENT                           mEfiExitBootServicesEvent;
    748   EFI_EVENT                           RtcEvent;
    749   VOID                                *RtcCallbackReg = NULL;
    750 
    751   mImageHandle = ImageHandle;
    752 
    753   Status = gBS->InstallProtocolInterface (
    754                   &Handle,
    755                   &gEfiSpeakerInterfaceProtocolGuid,
    756                   EFI_NATIVE_INTERFACE,
    757                   &mSpeakerInterface
    758                   );
    759 
    760   Status = gBS->LocateProtocol (
    761                   &gEfiPciRootBridgeIoProtocolGuid,
    762                   NULL,
    763                   (VOID **) &mPciRootBridgeIo
    764                   );
    765   ASSERT_EFI_ERROR (Status);
    766 
    767   VarSize = sizeof(EFI_PLATFORM_INFO_HOB);
    768   Status = gRT->GetVariable(
    769                   L"PlatformInfo",
    770                   &gEfiVlv2VariableGuid,
    771                   NULL,
    772                   &VarSize,
    773                   &mPlatformInfo
    774                   );
    775 
    776   //
    777   // Initialize Product Board ID variable
    778   //
    779   InitMfgAndConfigModeStateVar();
    780   InitPlatformBootMode();
    781 
    782   //
    783   // Install Observable protocol
    784   //
    785   InitializeObservableProtocol();
    786 
    787   Status = SaveSetupRecoveryVar();
    788   if (EFI_ERROR (Status)) {
    789     DEBUG ((EFI_D_ERROR, "InitializePlatform() Save SetupRecovery variable failed \n"));
    790   }
    791 
    792   VarSize = sizeof(SYSTEM_CONFIGURATION);
    793   Status = gRT->GetVariable(
    794                   NORMAL_SETUP_NAME,
    795                   &gEfiNormalSetupGuid,
    796                   NULL,
    797                   &VarSize,
    798                   &mSystemConfiguration
    799                   );
    800   if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
    801     //The setup variable is corrupted
    802     VarSize = sizeof(SYSTEM_CONFIGURATION);
    803     Status = gRT->GetVariable(
    804               L"SetupRecovery",
    805               &gEfiNormalSetupGuid,
    806               NULL,
    807               &VarSize,
    808               &mSystemConfiguration
    809               );
    810     ASSERT_EFI_ERROR (Status);
    811     Status = gRT->SetVariable (
    812                     NORMAL_SETUP_NAME,
    813                     &gEfiNormalSetupGuid,
    814                     EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
    815                     sizeof(SYSTEM_CONFIGURATION),
    816                     &mSystemConfiguration
    817                     );
    818   }
    819 
    820   Status = EfiCreateEventReadyToBootEx (
    821              TPL_CALLBACK,
    822              ReadyToBootFunction,
    823              NULL,
    824              &mReadyToBootEvent
    825              );
    826 
    827   //
    828   // Create a ReadyToBoot Event to run the PME init process
    829   //
    830   Status = EfiCreateEventReadyToBootEx (
    831              TPL_CALLBACK,
    832              InitPciDevPME,
    833              NULL,
    834              &mReadyToBootEvent
    835              );
    836   //
    837   // Create a ReadyToBoot Event to run enable PR0/PR1 and lock down,unlock variable region
    838   //
    839   if(mSystemConfiguration.SpiRwProtect==1) {
    840     Status = EfiCreateEventReadyToBootEx (
    841                TPL_CALLBACK,
    842                SpiBiosProtectionFunction,
    843                NULL,
    844                &mReadyToBootEvent
    845                );
    846   }
    847   //
    848   // Create a ReadyToBoot Event to run the thermalzone init process
    849   //
    850   Status = EfiCreateEventReadyToBootEx (
    851              TPL_CALLBACK,
    852              InitThermalZone,
    853              NULL,
    854              &mReadyToBootEvent
    855              );
    856 
    857   ReportStatusCodeEx (
    858     EFI_PROGRESS_CODE,
    859     EFI_COMPUTING_UNIT_CHIPSET | EFI_CU_PLATFORM_DXE_STEP1,
    860     0,
    861     &gEfiCallerIdGuid,
    862     NULL,
    863     NULL,
    864     0
    865     );
    866 
    867 #if defined(SENSOR_INFO_VAR_SUPPORT) && SENSOR_INFO_VAR_SUPPORT != 0
    868   //
    869   // Initialize Sensor Info variable
    870   //
    871   InitializeSensorInfoVariable();
    872 #endif
    873   InitPchPlatformPolicy(&mPlatformInfo);
    874   InitVlvPlatformPolicy();
    875 
    876   //
    877   //  Add usb policy
    878   //
    879   InitPlatformUsbPolicy();
    880   InitSioPlatformPolicy();
    881   InitializeClockRouting();
    882   InitializeSlotInfo();
    883   InitTcoReset();
    884 
    885   //
    886   //Init ExI
    887   //
    888   InitExI();
    889 
    890   ReportStatusCodeEx (
    891     EFI_PROGRESS_CODE,
    892     EFI_COMPUTING_UNIT_CHIPSET | EFI_CU_PLATFORM_DXE_STEP2,
    893     0,
    894     &gEfiCallerIdGuid,
    895     NULL,
    896     NULL,
    897     0
    898     );
    899 
    900   //
    901   // Install PCI Bus Driver Hook
    902   //
    903   PciBusDriverHook();
    904 
    905   InitItk();
    906 
    907   ReportStatusCodeEx (
    908     EFI_PROGRESS_CODE,
    909     EFI_COMPUTING_UNIT_CHIPSET | EFI_CU_PLATFORM_DXE_STEP3,
    910     0,
    911     &gEfiCallerIdGuid,
    912     NULL,
    913     NULL,
    914     0
    915     );
    916 
    917 
    918   //
    919   // Initialize Password States and Callbacks
    920   //
    921   PchInitBeforeBoot();
    922 
    923 #if defined SUPPORT_LVDS_DISPLAY && SUPPORT_LVDS_DISPLAY
    924 
    925 #endif
    926 
    927 #if defined(FIRMWARE_ID_BACKWARD_COMPATIBLE) && (FIRMWARE_ID_BACKWARD_COMPATIBLE != 0)
    928   //
    929   // Re-write Firmware ID if it is changed
    930   //
    931   InitFirmwareId();
    932 #endif
    933 
    934   ReportStatusCodeEx (
    935     EFI_PROGRESS_CODE,
    936     EFI_COMPUTING_UNIT_CHIPSET | EFI_CU_PLATFORM_DXE_STEP4,
    937     0,
    938     &gEfiCallerIdGuid,
    939     NULL,
    940     NULL,
    941     0
    942     );
    943 
    944 
    945   Status = gBS->CreateEventEx (
    946                   EVT_NOTIFY_SIGNAL,
    947                   TPL_NOTIFY,
    948                   EnableAcpiCallback,
    949                   NULL,
    950                   &gEfiEventExitBootServicesGuid,
    951                   &mEfiExitBootServicesEvent
    952                   );
    953 
    954   //
    955   // Adjust RTC deafult time to be BIOS-built time.
    956   //
    957   Status = gBS->CreateEvent (
    958                     EVT_NOTIFY_SIGNAL,
    959                     TPL_CALLBACK,
    960                     AdjustDefaultRtcTimeCallback,
    961                     NULL,
    962                     &RtcEvent
    963                     );
    964   if (!EFI_ERROR (Status)) {
    965       Status = gBS->RegisterProtocolNotify (
    966                       &gExitPmAuthProtocolGuid,
    967                       RtcEvent,
    968                       &RtcCallbackReg
    969                       );
    970 
    971   }
    972 
    973   return EFI_SUCCESS;
    974 }
    975 
    976 /**
    977   Source Or Destination with Length bytes.
    978 
    979   @param[in] Destination   Target memory
    980   @param[in] Source        Source memory
    981   @param[in] Length        Number of bytes
    982 
    983   @retval None
    984 
    985 **/
    986 VOID
    987 EfiOrMem (
    988   IN VOID   *Destination,
    989   IN VOID   *Source,
    990   IN UINTN  Length
    991   )
    992 {
    993   CHAR8 *Destination8;
    994   CHAR8 *Source8;
    995 
    996   if (Source < Destination) {
    997     Destination8  = (CHAR8 *) Destination + Length - 1;
    998     Source8       = (CHAR8 *) Source + Length - 1;
    999     while (Length--) {
   1000       *(Destination8--) |= *(Source8--);
   1001     }
   1002   } else {
   1003     Destination8  = (CHAR8 *) Destination;
   1004     Source8       = (CHAR8 *) Source;
   1005     while (Length--) {
   1006       *(Destination8++) |= *(Source8++);
   1007     }
   1008   }
   1009 }
   1010 
   1011 VOID
   1012 PchInitBeforeBoot()
   1013 {
   1014   //
   1015   // Saved SPI Opcode menu to fix EFI variable unable to write after S3 resume.
   1016   //
   1017   S3BootScriptSaveMemWrite (
   1018                          EfiBootScriptWidthUint32,
   1019                          (UINTN)(SPI_BASE_ADDRESS + (R_PCH_SPI_OPMENU0)),
   1020                          1,
   1021                          (VOID *)(UINTN)(SPI_BASE_ADDRESS + (R_PCH_SPI_OPMENU0)));
   1022 
   1023   S3BootScriptSaveMemWrite (
   1024                          EfiBootScriptWidthUint32,
   1025                          (UINTN)(SPI_BASE_ADDRESS + (R_PCH_SPI_OPMENU1)),
   1026                          1,
   1027                          (VOID *)(UINTN)(SPI_BASE_ADDRESS + (R_PCH_SPI_OPMENU1)));
   1028 
   1029   S3BootScriptSaveMemWrite (
   1030                          EfiBootScriptWidthUint16,
   1031                          (UINTN)(SPI_BASE_ADDRESS + R_PCH_SPI_OPTYPE),
   1032                          1,
   1033                          (VOID *)(UINTN)(SPI_BASE_ADDRESS + R_PCH_SPI_OPTYPE));
   1034 
   1035   S3BootScriptSaveMemWrite (
   1036                          EfiBootScriptWidthUint16,
   1037                          (UINTN)(SPI_BASE_ADDRESS + R_PCH_SPI_PREOP),
   1038                          1,
   1039                          (VOID *)(UINTN)(SPI_BASE_ADDRESS + R_PCH_SPI_PREOP));
   1040 
   1041   //
   1042   // Saved MTPMC_1 for S3 resume.
   1043   //
   1044   S3BootScriptSaveMemWrite (
   1045                          EfiBootScriptWidthUint32,
   1046                          (UINTN)(PMC_BASE_ADDRESS + R_PCH_PMC_MTPMC1),
   1047                          1,
   1048                          (VOID *)(UINTN)(PMC_BASE_ADDRESS + R_PCH_PMC_MTPMC1));
   1049   return;
   1050 }
   1051 
   1052 VOID
   1053 EFIAPI
   1054 ReadyToBootFunction (
   1055   EFI_EVENT  Event,
   1056   VOID       *Context
   1057   )
   1058 {
   1059   EFI_STATUS                      Status;
   1060   EFI_ISA_ACPI_PROTOCOL           *IsaAcpi;
   1061   EFI_ISA_ACPI_DEVICE_ID          IsaDevice;
   1062   UINTN                           Size;
   1063   UINT16                          State;
   1064   EFI_TPM_MP_DRIVER_PROTOCOL      *TpmMpDriver;
   1065   EFI_CPU_IO_PROTOCOL             *CpuIo;
   1066   UINT8                           Data;
   1067   UINT8                           ReceiveBuffer [64];
   1068   UINT32                          ReceiveBufferSize;
   1069 
   1070   UINT8 TpmForceClearCommand [] =              {0x00, 0xC1,
   1071                                                 0x00, 0x00, 0x00, 0x0A,
   1072                                                 0x00, 0x00, 0x00, 0x5D};
   1073   UINT8 TpmPhysicalPresenceCommand [] =        {0x00, 0xC1,
   1074                                                 0x00, 0x00, 0x00, 0x0C,
   1075                                                 0x40, 0x00, 0x00, 0x0A,
   1076                                                 0x00, 0x00};
   1077   UINT8 TpmPhysicalDisableCommand [] =         {0x00, 0xC1,
   1078                                                 0x00, 0x00, 0x00, 0x0A,
   1079                                                 0x00, 0x00, 0x00, 0x70};
   1080   UINT8 TpmPhysicalEnableCommand [] =          {0x00, 0xC1,
   1081                                                 0x00, 0x00, 0x00, 0x0A,
   1082                                                 0x00, 0x00, 0x00, 0x6F};
   1083   UINT8 TpmPhysicalSetDeactivatedCommand [] =  {0x00, 0xC1,
   1084                                                 0x00, 0x00, 0x00, 0x0B,
   1085                                                 0x00, 0x00, 0x00, 0x72,
   1086                                                 0x00};
   1087   UINT8 TpmSetOwnerInstallCommand [] =         {0x00, 0xC1,
   1088                                                 0x00, 0x00, 0x00, 0x0B,
   1089                                                 0x00, 0x00, 0x00, 0x71,
   1090                                                 0x00};
   1091 
   1092   Size = sizeof(UINT16);
   1093   Status = gRT->GetVariable (
   1094                   VAR_EQ_FLOPPY_MODE_DECIMAL_NAME,
   1095                   &gEfiNormalSetupGuid,
   1096                   NULL,
   1097                   &Size,
   1098                   &State
   1099                   );
   1100 
   1101   //
   1102   // Disable Floppy Controller if needed
   1103   //
   1104   Status = gBS->LocateProtocol (&gEfiIsaAcpiProtocolGuid, NULL, (VOID **) &IsaAcpi);
   1105   if (!EFI_ERROR(Status) && (State == 0x00)) {
   1106     IsaDevice.HID = EISA_PNP_ID(0x604);
   1107     IsaDevice.UID = 0;
   1108     Status = IsaAcpi->EnableDevice(IsaAcpi, &IsaDevice, FALSE);
   1109   }
   1110 
   1111   //
   1112   // save LAN info to a variable
   1113   //
   1114   if (NULL != mPciLanInfo) {
   1115     gRT->SetVariable (
   1116            L"PciLanInfo",
   1117            &gEfiPciLanInfoGuid,
   1118            EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
   1119            mPciLanCount * sizeof(PCI_LAN_INFO),
   1120            mPciLanInfo
   1121            );
   1122   }
   1123 
   1124   if (NULL != mPciLanInfo) {
   1125     gBS->FreePool (mPciLanInfo);
   1126     mPciLanInfo = NULL;
   1127   }
   1128 
   1129 
   1130   //
   1131   // Handle ACPI OS TPM requests here
   1132   //
   1133   Status = gBS->LocateProtocol (
   1134                   &gEfiCpuIoProtocolGuid,
   1135                   NULL,
   1136                   (VOID **)&CpuIo
   1137                   );
   1138   Status = gBS->LocateProtocol (
   1139                   &gEfiTpmMpDriverProtocolGuid,
   1140                   NULL,
   1141                   (VOID **)&TpmMpDriver
   1142                   );
   1143   if (!EFI_ERROR (Status))
   1144   {
   1145     Data = ReadCmosBank1Byte (CpuIo, ACPI_TPM_REQUEST);
   1146 
   1147     //
   1148     // Clear pending ACPI TPM request indicator
   1149     //
   1150     WriteCmosBank1Byte (CpuIo, ACPI_TPM_REQUEST, 0x00);
   1151     if (Data != 0)
   1152     {
   1153       WriteCmosBank1Byte (CpuIo, ACPI_TPM_LAST_REQUEST, Data);
   1154 
   1155       //
   1156       // Assert Physical Presence for these commands
   1157       //
   1158       TpmPhysicalPresenceCommand [11] = 0x20;
   1159       ReceiveBufferSize = sizeof(ReceiveBuffer);
   1160       Status = TpmMpDriver->Transmit (
   1161                               TpmMpDriver, TpmPhysicalPresenceCommand,
   1162                               sizeof (TpmPhysicalPresenceCommand),
   1163                               ReceiveBuffer, &ReceiveBufferSize
   1164                               );
   1165       //
   1166       // PF PhysicalPresence = TRUE
   1167       //
   1168       TpmPhysicalPresenceCommand [11] = 0x08;
   1169       ReceiveBufferSize = sizeof(ReceiveBuffer);
   1170       Status = TpmMpDriver->Transmit (
   1171                               TpmMpDriver, TpmPhysicalPresenceCommand,
   1172                               sizeof (TpmPhysicalPresenceCommand),
   1173                               ReceiveBuffer,
   1174                               &ReceiveBufferSize
   1175                               );
   1176       if (Data == 0x01)
   1177       {
   1178         //
   1179         // TPM_PhysicalEnable
   1180         //
   1181         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1182         Status = TpmMpDriver->Transmit (
   1183                                 TpmMpDriver, TpmPhysicalEnableCommand,
   1184                                 sizeof (TpmPhysicalEnableCommand),
   1185                                 ReceiveBuffer, &ReceiveBufferSize
   1186                                 );
   1187       }
   1188       if (Data == 0x02)
   1189       {
   1190         //
   1191         // TPM_PhysicalDisable
   1192         //
   1193         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1194         Status = TpmMpDriver->Transmit (
   1195                                 TpmMpDriver, TpmPhysicalDisableCommand,
   1196                                 sizeof (TpmPhysicalDisableCommand),
   1197                                 ReceiveBuffer,
   1198                                 &ReceiveBufferSize
   1199                                 );
   1200       }
   1201       if (Data == 0x03)
   1202       {
   1203         //
   1204         // TPM_PhysicalSetDeactivated=FALSE
   1205         //
   1206         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1207         TpmPhysicalSetDeactivatedCommand [10] = 0x00;
   1208         Status = TpmMpDriver->Transmit (
   1209                                 TpmMpDriver,
   1210                                 TpmPhysicalSetDeactivatedCommand,
   1211                                 sizeof (TpmPhysicalSetDeactivatedCommand),
   1212                                 ReceiveBuffer, &ReceiveBufferSize
   1213                                 );
   1214         gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);
   1215       }
   1216       if (Data == 0x04)
   1217       {
   1218         //
   1219         // TPM_PhysicalSetDeactivated=TRUE
   1220         //
   1221         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1222         TpmPhysicalSetDeactivatedCommand [10] = 0x01;
   1223         Status = TpmMpDriver->Transmit (
   1224                                 TpmMpDriver,
   1225                                 TpmPhysicalSetDeactivatedCommand,
   1226                                 sizeof (TpmPhysicalSetDeactivatedCommand),
   1227                                 ReceiveBuffer,
   1228                                 &ReceiveBufferSize
   1229                                 );
   1230         gRT->ResetSystem (
   1231                EfiResetWarm,
   1232                EFI_SUCCESS,
   1233                0,
   1234                NULL
   1235                );
   1236       }
   1237       if (Data == 0x05)
   1238       {
   1239         //
   1240         // TPM_ForceClear
   1241         //
   1242         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1243         Status = TpmMpDriver->Transmit (
   1244                                 TpmMpDriver,
   1245                                 TpmForceClearCommand,
   1246                                 sizeof (TpmForceClearCommand),
   1247                                 ReceiveBuffer,
   1248                                 &ReceiveBufferSize
   1249                                 );
   1250         gRT->ResetSystem (
   1251                EfiResetWarm,
   1252                EFI_SUCCESS,
   1253                0,
   1254                NULL
   1255                );
   1256       }
   1257       if (Data == 0x06)
   1258       {
   1259         //
   1260         // TPM_PhysicalEnable
   1261         //
   1262         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1263         Status = TpmMpDriver->Transmit (
   1264                                 TpmMpDriver,
   1265                                 TpmPhysicalEnableCommand,
   1266                                 sizeof (TpmPhysicalEnableCommand),
   1267                                 ReceiveBuffer,
   1268                                 &ReceiveBufferSize
   1269                                 );
   1270         //
   1271         // TPM_PhysicalSetDeactivated=FALSE
   1272         //
   1273         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1274         TpmPhysicalSetDeactivatedCommand [10] = 0x00;
   1275         Status = TpmMpDriver->Transmit (
   1276                                 TpmMpDriver,
   1277                                 TpmPhysicalSetDeactivatedCommand,
   1278                                 sizeof (TpmPhysicalSetDeactivatedCommand),
   1279                                 ReceiveBuffer,
   1280                                 &ReceiveBufferSize
   1281                                 );
   1282         gRT->ResetSystem (
   1283                EfiResetWarm,
   1284                EFI_SUCCESS,
   1285                0,
   1286                NULL
   1287                );
   1288       }
   1289       if (Data == 0x07)
   1290       {
   1291         //
   1292         // TPM_PhysicalSetDeactivated=TRUE
   1293         //
   1294         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1295         TpmPhysicalSetDeactivatedCommand [10] = 0x01;
   1296         Status = TpmMpDriver->Transmit (
   1297                                 TpmMpDriver,
   1298                                 TpmPhysicalSetDeactivatedCommand,
   1299                                 sizeof (TpmPhysicalSetDeactivatedCommand),
   1300                                 ReceiveBuffer,
   1301                                 &ReceiveBufferSize
   1302                                 );
   1303         //
   1304         // TPM_PhysicalDisable
   1305         //
   1306         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1307         Status = TpmMpDriver->Transmit (
   1308                                 TpmMpDriver,
   1309                                 TpmPhysicalDisableCommand,
   1310                                 sizeof (TpmPhysicalDisableCommand),
   1311                                 ReceiveBuffer,
   1312                                 &ReceiveBufferSize
   1313                                 );
   1314         gRT->ResetSystem (
   1315                EfiResetWarm,
   1316                EFI_SUCCESS,
   1317                0,
   1318                NULL
   1319                );
   1320       }
   1321       if (Data == 0x08)
   1322       {
   1323         //
   1324         // TPM_SetOwnerInstall=TRUE
   1325         //
   1326         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1327         TpmSetOwnerInstallCommand [10] = 0x01;
   1328         Status = TpmMpDriver->Transmit (
   1329                                 TpmMpDriver,
   1330                                 TpmSetOwnerInstallCommand,
   1331                                 sizeof (TpmSetOwnerInstallCommand),
   1332                                 ReceiveBuffer,
   1333                                 &ReceiveBufferSize
   1334                                 );
   1335       }
   1336       if (Data == 0x09)
   1337       {
   1338         //
   1339         // TPM_SetOwnerInstall=FALSE
   1340         //
   1341         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1342         TpmSetOwnerInstallCommand [10] = 0x00;
   1343         Status = TpmMpDriver->Transmit (
   1344                                 TpmMpDriver,
   1345                                 TpmSetOwnerInstallCommand,
   1346                                 sizeof (TpmSetOwnerInstallCommand),
   1347                                 ReceiveBuffer,
   1348                                 &ReceiveBufferSize
   1349                                 );
   1350       }
   1351       if (Data == 0x0A)
   1352       {
   1353         //
   1354         // TPM_PhysicalEnable
   1355         //
   1356         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1357         Status = TpmMpDriver->Transmit (
   1358                                 TpmMpDriver,
   1359                                 TpmPhysicalEnableCommand,
   1360                                 sizeof (TpmPhysicalEnableCommand),
   1361                                 ReceiveBuffer,
   1362                                 &ReceiveBufferSize
   1363                                 );
   1364         //
   1365         // TPM_PhysicalSetDeactivated=FALSE
   1366         //
   1367         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1368         TpmPhysicalSetDeactivatedCommand [10] = 0x00;
   1369         Status = TpmMpDriver->Transmit (
   1370                                 TpmMpDriver,
   1371                                 TpmPhysicalSetDeactivatedCommand,
   1372                                 sizeof (TpmPhysicalSetDeactivatedCommand),
   1373                                 ReceiveBuffer,
   1374                                 &ReceiveBufferSize
   1375                                 );
   1376         //
   1377         // Do TPM_SetOwnerInstall=TRUE on next reboot
   1378         //
   1379 
   1380         WriteCmosBank1Byte (CpuIo, ACPI_TPM_REQUEST, 0xF0);
   1381 
   1382         gRT->ResetSystem (
   1383                EfiResetWarm,
   1384                EFI_SUCCESS,
   1385                0,
   1386                NULL
   1387                );
   1388       }
   1389       if (Data == 0x0B)
   1390       {
   1391         //
   1392         // TPM_SetOwnerInstall=FALSE
   1393         //
   1394         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1395         TpmSetOwnerInstallCommand [10] = 0x00;
   1396         Status = TpmMpDriver->Transmit (
   1397                                 TpmMpDriver,
   1398                                 TpmSetOwnerInstallCommand,
   1399                                 sizeof (TpmSetOwnerInstallCommand),
   1400                                 ReceiveBuffer,
   1401                                 &ReceiveBufferSize
   1402                                 );
   1403         //
   1404         // TPM_PhysicalSetDeactivated=TRUE
   1405         //
   1406         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1407         TpmPhysicalSetDeactivatedCommand [10] = 0x01;
   1408         Status = TpmMpDriver->Transmit (
   1409                                 TpmMpDriver,
   1410                                 TpmPhysicalSetDeactivatedCommand,
   1411                                 sizeof (TpmPhysicalSetDeactivatedCommand),
   1412                                 ReceiveBuffer,
   1413                                 &ReceiveBufferSize
   1414                                 );
   1415         //
   1416         // TPM_PhysicalDisable
   1417         //
   1418         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1419         Status = TpmMpDriver->Transmit (
   1420                                 TpmMpDriver,
   1421                                 TpmPhysicalDisableCommand,
   1422                                 sizeof (TpmPhysicalDisableCommand),
   1423                                 ReceiveBuffer,
   1424                                 &ReceiveBufferSize
   1425                                 );
   1426         gRT->ResetSystem (
   1427                EfiResetWarm,
   1428                EFI_SUCCESS,
   1429                0,
   1430                NULL
   1431                );
   1432       }
   1433       if (Data == 0x0E)
   1434       {
   1435         //
   1436         // TPM_ForceClear
   1437         //
   1438         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1439         Status = TpmMpDriver->Transmit (
   1440                                 TpmMpDriver,
   1441                                 TpmForceClearCommand,
   1442                                 sizeof (TpmForceClearCommand),
   1443                                 ReceiveBuffer,
   1444                                 &ReceiveBufferSize
   1445                                 );
   1446         //
   1447         // TPM_PhysicalEnable
   1448         //
   1449         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1450         Status = TpmMpDriver->Transmit (
   1451                                 TpmMpDriver,
   1452                                 TpmPhysicalEnableCommand,
   1453                                 sizeof (TpmPhysicalEnableCommand),
   1454                                 ReceiveBuffer,
   1455                                 &ReceiveBufferSize
   1456                                 );
   1457         //
   1458         // TPM_PhysicalSetDeactivated=FALSE
   1459         //
   1460         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1461         TpmPhysicalSetDeactivatedCommand [10] = 0x00;
   1462         Status = TpmMpDriver->Transmit (
   1463                                 TpmMpDriver,
   1464                                 TpmPhysicalSetDeactivatedCommand,
   1465                                 sizeof (TpmPhysicalSetDeactivatedCommand),
   1466                                 ReceiveBuffer,
   1467                                 &ReceiveBufferSize
   1468                                 );
   1469         gRT->ResetSystem (
   1470                EfiResetWarm,
   1471                EFI_SUCCESS,
   1472                0,
   1473                NULL
   1474                );
   1475       }
   1476       if (Data == 0xF0)
   1477       {
   1478         //
   1479         // Second part of ACPI TPM request 0x0A: OEM custom TPM_SetOwnerInstall=TRUE
   1480         //
   1481         ReceiveBufferSize = sizeof(ReceiveBuffer);
   1482         TpmSetOwnerInstallCommand [10] = 0x01;
   1483         Status = TpmMpDriver->Transmit (
   1484                                 TpmMpDriver,
   1485                                 TpmSetOwnerInstallCommand,
   1486                                 sizeof (TpmSetOwnerInstallCommand),
   1487                                 ReceiveBuffer,
   1488                                 &ReceiveBufferSize
   1489                                 );
   1490         WriteCmosBank1Byte (CpuIo, ACPI_TPM_LAST_REQUEST, 0x0A);
   1491       }
   1492       //
   1493       // Deassert Physical Presence
   1494       //
   1495       TpmPhysicalPresenceCommand [11] = 0x10;
   1496       ReceiveBufferSize = sizeof(ReceiveBuffer);
   1497       Status = TpmMpDriver->Transmit (
   1498                               TpmMpDriver,
   1499                               TpmPhysicalPresenceCommand,
   1500                               sizeof (TpmPhysicalPresenceCommand),
   1501                               ReceiveBuffer,
   1502                               &ReceiveBufferSize
   1503                               );
   1504     }
   1505   }
   1506 
   1507   return;
   1508 }
   1509 
   1510 /**
   1511 
   1512   Initializes manufacturing and config mode setting.
   1513 
   1514 **/
   1515 VOID
   1516 InitMfgAndConfigModeStateVar()
   1517 {
   1518   EFI_PLATFORM_SETUP_ID           *BootModeBuffer;
   1519   VOID                            *HobList;
   1520 
   1521 
   1522   HobList = GetFirstGuidHob(&gEfiPlatformBootModeGuid);
   1523   if (HobList != NULL) {
   1524     BootModeBuffer = GET_GUID_HOB_DATA (HobList);
   1525 
   1526       //
   1527       // Check if in Manufacturing mode
   1528       //
   1529       if ( !CompareMem (
   1530               &BootModeBuffer->SetupName,
   1531               MANUFACTURE_SETUP_NAME,
   1532               StrSize (MANUFACTURE_SETUP_NAME)
   1533               ) ) {
   1534         mMfgMode = TRUE;
   1535       }
   1536 
   1537 
   1538 
   1539   }
   1540 
   1541 }
   1542 
   1543 /**
   1544 
   1545   Initializes manufacturing and config mode setting.
   1546 
   1547 **/
   1548 VOID
   1549 InitPlatformBootMode()
   1550 {
   1551   EFI_PLATFORM_SETUP_ID           *BootModeBuffer;
   1552   VOID                            *HobList;
   1553 
   1554   HobList = GetFirstGuidHob(&gEfiPlatformBootModeGuid);
   1555   if (HobList != NULL) {
   1556     BootModeBuffer = GET_GUID_HOB_DATA (HobList);
   1557     mPlatformBootMode = BootModeBuffer->PlatformBootMode;
   1558   }
   1559 }
   1560 
   1561 /**
   1562 
   1563   Initializes ITK.
   1564 
   1565 **/
   1566 VOID
   1567 InitItk(
   1568   )
   1569 {
   1570   EFI_STATUS                          Status;
   1571   UINT16                              ItkModBiosState;
   1572   UINT8                               Value;
   1573   UINTN                               DataSize;
   1574   UINT32                              Attributes;
   1575 
   1576   //
   1577   // Setup local variable according to ITK variable
   1578   //
   1579   //
   1580   // Read ItkBiosModVar to determine if BIOS has been modified by ITK
   1581   // If ItkBiosModVar = 0 or if variable hasn't been initialized then BIOS has not been modified by ITK modified
   1582   // Set local variable VAR_EQ_ITK_BIOS_MOD_DECIMAL_NAME=0 if BIOS has not been modified by ITK
   1583   //
   1584   DataSize = sizeof (Value);
   1585   Status = gRT->GetVariable (
   1586                   ITK_BIOS_MOD_VAR_NAME,
   1587                   &gItkDataVarGuid,
   1588                   &Attributes,
   1589                   &DataSize,
   1590                   &Value
   1591                   );
   1592   if (Status == EFI_NOT_FOUND) {
   1593     //
   1594     // Variable not found, hasn't been initialized, intialize to 0
   1595     //
   1596     Value=0x00;
   1597   //
   1598   // Write variable to flash.
   1599   //
   1600   gRT->SetVariable (
   1601          ITK_BIOS_MOD_VAR_NAME,
   1602          &gItkDataVarGuid,
   1603          EFI_VARIABLE_RUNTIME_ACCESS |
   1604          EFI_VARIABLE_NON_VOLATILE |
   1605          EFI_VARIABLE_BOOTSERVICE_ACCESS,
   1606          sizeof (Value),
   1607          &Value
   1608          );
   1609 
   1610 }
   1611   if ( (!EFI_ERROR (Status)) || (Status == EFI_NOT_FOUND) ) {
   1612     if (Value == 0x00) {
   1613       ItkModBiosState = 0x00;
   1614     } else {
   1615       ItkModBiosState = 0x01;
   1616     }
   1617     gRT->SetVariable (
   1618            VAR_EQ_ITK_BIOS_MOD_DECIMAL_NAME,
   1619            &gEfiNormalSetupGuid,
   1620            EFI_VARIABLE_BOOTSERVICE_ACCESS,
   1621            2,
   1622            (void *)&ItkModBiosState
   1623            );
   1624   }
   1625 }
   1626 
   1627 #if defined(FIRMWARE_ID_BACKWARD_COMPATIBLE) && (FIRMWARE_ID_BACKWARD_COMPATIBLE != 0)
   1628 
   1629 /**
   1630 
   1631   Initializes the BIOS FIRMWARE ID from the FIRMWARE_ID build variable.
   1632 
   1633 **/
   1634 STATIC
   1635 VOID
   1636 InitFirmwareId(
   1637   )
   1638 {
   1639   EFI_STATUS   Status;
   1640   CHAR16       FirmwareIdNameWithPassword[] = FIRMWARE_ID_NAME_WITH_PASSWORD;
   1641 
   1642   //
   1643   // First try writing the variable without a password in case we are
   1644   // upgrading from a BIOS without password protection on the FirmwareId
   1645   //
   1646   Status = gRT->SetVariable(
   1647                   (CHAR16 *)&gFirmwareIdName,
   1648                   &gFirmwareIdGuid,
   1649                   EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS |
   1650                   EFI_VARIABLE_RUNTIME_ACCESS,
   1651                   sizeof( FIRMWARE_ID ) - 1,
   1652                   FIRMWARE_ID
   1653                   );
   1654 
   1655   if (Status == EFI_INVALID_PARAMETER) {
   1656 
   1657     //
   1658     // Since setting the firmware id without the password failed,
   1659     // a password must be required.
   1660     //
   1661     Status = gRT->SetVariable(
   1662                     (CHAR16 *)&FirmwareIdNameWithPassword,
   1663                     &gFirmwareIdGuid,
   1664                     EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS |
   1665                     EFI_VARIABLE_RUNTIME_ACCESS,
   1666                     sizeof( FIRMWARE_ID ) - 1,
   1667                     FIRMWARE_ID
   1668                     );
   1669   }
   1670 }
   1671 #endif
   1672 
   1673 VOID
   1674 UpdateDVMTSetup(
   1675   )
   1676 {
   1677     //
   1678   // Workaround to support IIA bug.
   1679   // IIA request to change option value to 4, 5 and 7 relatively
   1680   // instead of 1, 2, and 3 which follow Lakeport Specs.
   1681   // Check option value, temporary hardcode GraphicsDriverMemorySize
   1682   // Option value to fulfill IIA requirment. So that user no need to
   1683   // load default and update setupvariable after update BIOS.
   1684   //   Option value hardcoded as: 1 to 4, 2 to 5, 3 to 7.
   1685   // *This is for broadwater and above product only.
   1686   //
   1687 
   1688   SYSTEM_CONFIGURATION        SystemConfiguration;
   1689   UINTN                       VarSize;
   1690   EFI_STATUS                  Status;
   1691 
   1692   VarSize = sizeof(SYSTEM_CONFIGURATION);
   1693   Status = gRT->GetVariable(
   1694                   NORMAL_SETUP_NAME,
   1695                   &gEfiNormalSetupGuid,
   1696                   NULL,
   1697                   &VarSize,
   1698                   &SystemConfiguration
   1699                   );
   1700 
   1701   if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
   1702     //The setup variable is corrupted
   1703     VarSize = sizeof(SYSTEM_CONFIGURATION);
   1704     Status = gRT->GetVariable(
   1705               L"SetupRecovery",
   1706               &gEfiNormalSetupGuid,
   1707               NULL,
   1708               &VarSize,
   1709               &SystemConfiguration
   1710               );
   1711     ASSERT_EFI_ERROR (Status);
   1712   }
   1713 
   1714   if((SystemConfiguration.GraphicsDriverMemorySize < 4) && !EFI_ERROR(Status) ) {
   1715     switch (SystemConfiguration.GraphicsDriverMemorySize){
   1716       case 1:
   1717         SystemConfiguration.GraphicsDriverMemorySize = 4;
   1718         break;
   1719       case 2:
   1720         SystemConfiguration.GraphicsDriverMemorySize = 5;
   1721         break;
   1722       case 3:
   1723         SystemConfiguration.GraphicsDriverMemorySize = 7;
   1724         break;
   1725       default:
   1726         break;
   1727      }
   1728 
   1729     Status = gRT->SetVariable (
   1730                     NORMAL_SETUP_NAME,
   1731                     &gEfiNormalSetupGuid,
   1732                     EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
   1733                     sizeof(SYSTEM_CONFIGURATION),
   1734                     &SystemConfiguration
   1735                     );
   1736   }
   1737 }
   1738 
   1739 VOID
   1740 InitPlatformUsbPolicy (
   1741   VOID
   1742   )
   1743 
   1744 {
   1745   EFI_HANDLE              Handle;
   1746   EFI_STATUS              Status;
   1747 
   1748   Handle = NULL;
   1749 
   1750   mUsbPolicyData.Version                       = (UINT8)USB_POLICY_PROTOCOL_REVISION_2;
   1751   mUsbPolicyData.UsbMassStorageEmulationType   = mSystemConfiguration.UsbBIOSINT13DeviceEmulation;
   1752   if(mUsbPolicyData.UsbMassStorageEmulationType == 3) {
   1753     mUsbPolicyData.UsbEmulationSize = mSystemConfiguration.UsbBIOSINT13DeviceEmulationSize;
   1754   } else {
   1755     mUsbPolicyData.UsbEmulationSize = 0;
   1756   }
   1757   mUsbPolicyData.UsbZipEmulationType         = mSystemConfiguration.UsbZipEmulation;
   1758   mUsbPolicyData.UsbOperationMode              = HIGH_SPEED;
   1759 
   1760   //
   1761   //  Some chipset need Period smi, 0 = LEGACY_PERIOD_UN_SUPP
   1762   //
   1763   mUsbPolicyData.USBPeriodSupport      = LEGACY_PERIOD_UN_SUPP;
   1764 
   1765   //
   1766   //  Some platform need legacyfree, 0 = LEGACY_FREE_UN_SUPP
   1767   //
   1768   mUsbPolicyData.LegacyFreeSupport    = LEGACY_FREE_UN_SUPP;
   1769 
   1770   //
   1771   //  Set Code base , TIANO_CODE_BASE =0x01, ICBD =0x00
   1772   //
   1773   mUsbPolicyData.CodeBase    = (UINT8)ICBD_CODE_BASE;
   1774 
   1775   //
   1776   //  Some chispet 's LpcAcpibase are diffrent,set by platform or chipset,
   1777   //  default is Ich  acpibase =0x040. acpitimerreg=0x08.
   1778   mUsbPolicyData.LpcAcpiBase     = 0x40;
   1779   mUsbPolicyData.AcpiTimerReg    = 0x08;
   1780 
   1781   //
   1782   //  Set for reduce usb post time
   1783   //
   1784   mUsbPolicyData.UsbTimeTue           = 0x00;
   1785   mUsbPolicyData.InternelHubExist     = 0x00;  //TigerPoint doesn't have RMH
   1786   mUsbPolicyData.EnumWaitPortStableStall    = 100;
   1787 
   1788 
   1789   Status = gBS->InstallProtocolInterface (
   1790                   &Handle,
   1791                   &gUsbPolicyGuid,
   1792                   EFI_NATIVE_INTERFACE,
   1793                   &mUsbPolicyData
   1794                   );
   1795   ASSERT_EFI_ERROR(Status);
   1796 
   1797 }
   1798 
   1799 UINT8
   1800 ReadCmosBank1Byte (
   1801   IN  EFI_CPU_IO_PROTOCOL             *CpuIo,
   1802   IN  UINT8                           Index
   1803   )
   1804 {
   1805   UINT8                               Data;
   1806 
   1807   CpuIo->Io.Write (CpuIo, EfiCpuIoWidthUint8, 0x72, 1, &Index);
   1808   CpuIo->Io.Read (CpuIo, EfiCpuIoWidthUint8, 0x73, 1, &Data);
   1809   return Data;
   1810 }
   1811 
   1812 VOID
   1813 WriteCmosBank1Byte (
   1814   IN  EFI_CPU_IO_PROTOCOL             *CpuIo,
   1815   IN  UINT8                           Index,
   1816   IN  UINT8                           Data
   1817   )
   1818 {
   1819   CpuIo->Io.Write (
   1820               CpuIo,
   1821               EfiCpuIoWidthUint8,
   1822               0x72,
   1823               1,
   1824               &Index
   1825               );
   1826   CpuIo->Io.Write (
   1827               CpuIo,
   1828               EfiCpuIoWidthUint8,
   1829               0x73,
   1830               1,
   1831               &Data
   1832               );
   1833 }
   1834 
   1835