3 Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials are licensed and made available under
8 the terms and conditions of the BSD License that accompanies this distribution.
10 The full text of the license may be found at
12 http://opensource.org/licenses/bsd-license.php.
16 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
18 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
30 Platform Initialization Driver.
35 #include "PlatformDxe.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>
56 // VLV2 GPIO GROUP OFFSET
58 #define GPIO_SCORE_OFFSET 0x0000
59 #define GPIO_NCORE_OFFSET 0x1000
60 #define GPIO_SSUS_OFFSET 0x2000
67 GPIO_CONF_PAD_INIT mTB_BL_GpioInitData_SC_TRI_Exit_boot_Service
[] =
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),
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
[];
86 EFI_PLATFORM_INFO_HOB mPlatformInfo
;
87 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*mPciRootBridgeIo
;
88 EFI_EVENT mReadyToBootEvent
;
90 UINT8 mSmbusRsvdAddresses
[] = PLATFORM_SMBUS_RSVD_ADDRESSES
;
91 UINT8 mNumberSmbusAddress
= sizeof( mSmbusRsvdAddresses
) / sizeof( mSmbusRsvdAddresses
[0] );
92 UINT32 mSubsystemVidDid
;
93 UINT32 mSubsystemAudioVidDid
;
95 UINTN mPciLanCount
= 0;
96 VOID
*mPciLanInfo
= NULL
;
99 static EFI_SPEAKER_IF_PROTOCOL mSpeakerInterface
= {
100 ProgramToneFrequency
,
104 EFI_USB_POLICY_PROTOCOL mUsbPolicyData
= {0};
107 CFIO_PNP_INIT mTB_BL_GpioInitData_SC_TRI_S0ix_Exit_boot_Service
[] =
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
131 IN VOID
*Destination
,
136 #if defined(FIRMWARE_ID_BACKWARD_COMPATIBLE) && (FIRMWARE_ID_BACKWARD_COMPATIBLE != 0)
144 InitializeClockRouting(
151 #if defined(SENSOR_INFO_VAR_SUPPORT) && SENSOR_INFO_VAR_SUPPORT != 0
153 InitializeSensorInfoVariable (
168 InitPlatformBootMode();
171 InitMfgAndConfigModeStateVar();
174 InitPchPlatformPolicy (
175 IN EFI_PLATFORM_INFO_HOB
*PlatformInfo
179 InitVlvPlatformPolicy (
183 InitSioPlatformPolicy(
195 InitPlatformUsbPolicy (
207 SaveSetupRecoveryVar(
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
;
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
;
227 Status
= gRT
->GetVariable(
229 &gEfiNormalSetupGuid
,
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
;
243 SizeOfSetupVar
= sizeof(SYSTEM_CONFIGURATION
);
244 Status
= gRT
->GetVariable(
246 &gEfiNormalSetupGuid
,
251 ASSERT_EFI_ERROR (Status
);
253 Status
= gRT
->SetVariable (
255 &gEfiNormalSetupGuid
,
256 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
257 sizeof(SYSTEM_CONFIGURATION
),
260 ASSERT_EFI_ERROR (Status
);
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
);
272 FreePool (RecoveryNvData
);
274 FreePool (SetupData
);
282 TristateLpcGpioConfig (
283 IN UINT32 Gpio_Mmio_Offset
,
284 IN UINT32 Gpio_Pin_Num
,
285 GPIO_CONF_PAD_INIT
* Gpio_Conf_Data
296 // GPIO WELL -- Memory base registers
300 // A0 BIOS Spec doesn't mention it although X0 does. comment out now.
301 // GPIO write 0x01001002 to IOBASE + Gpio_Mmio_Offset + 0x0900
304 for(index
=0; index
< Gpio_Pin_Num
; index
++)
307 // Calculate the MMIO Address for specific GPIO pin CONF0 register pointed by index.
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;
313 DEBUG ((EFI_D_INFO
, "%s, ", Gpio_Conf_Data
[index
].pad_name
));
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
,
324 // Step 1: PadVal Programming
326 pad_val
.dw
= MmioRead32(mmio_padval
);
329 // Config PAD_VAL only for GPIO (Non-Native) Pin
331 if(Native
!= Gpio_Conf_Data
[index
].usage
)
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
337 // set GPO default value
339 if(Gpio_Conf_Data
[index
].usage
== GPO
&& Gpio_Conf_Data
[index
].gpod4
!= NA
)
341 pad_val
.r
.pad_val
= Gpio_Conf_Data
[index
].gpod4
;
346 DEBUG ((EFI_D_INFO
, "Set PAD_VAL = 0x%08x, ", pad_val
.dw
));
348 MmioWrite32(mmio_padval
, pad_val
.dw
);
351 // Step 2: CONF0 Programming
352 // Read GPIO default CONF0 value, which is assumed to be default value after reset.
354 conf0_val
.dw
= MmioRead32(mmio_conf0
);
359 conf0_val
.r
.Func_Pin_Mux
= Gpio_Conf_Data
[index
].func
;
361 if(GPO
== Gpio_Conf_Data
[index
].usage
)
364 // If used as GPO, then internal pull need to be disabled
366 conf0_val
.r
.Pull_assign
= 0; // Non-pull
371 // Set PullUp / PullDown
373 if(P_20K_H
== Gpio_Conf_Data
[index
].pull
)
375 conf0_val
.r
.Pull_assign
= 0x1; // PullUp
376 conf0_val
.r
.Pull_strength
= 0x2;// 20K
378 else if(P_20K_L
== Gpio_Conf_Data
[index
].pull
)
380 conf0_val
.r
.Pull_assign
= 0x2; // PullDown
381 conf0_val
.r
.Pull_strength
= 0x2;// 20K
383 else if(P_NONE
== Gpio_Conf_Data
[index
].pull
)
385 conf0_val
.r
.Pull_assign
= 0; // Non-pull
389 ASSERT(FALSE
); // Invalid value
394 // Set INT Trigger Type
396 conf0_val
.dw
&= ~0x0f000000; // Clear bits 27:24
399 // Set INT Trigger Type
401 if(TRIG_
== Gpio_Conf_Data
[index
].int_type
)
404 // Interrupt not capable, clear bits 27:24
409 conf0_val
.dw
|= (Gpio_Conf_Data
[index
].int_type
& 0x0f)<<24;
412 DEBUG ((EFI_D_INFO
, "Set CONF0 = 0x%08x\n", conf0_val
.dw
));
415 // Write back the targeted GPIO config value according to platform (board) GPIO setting
417 MmioWrite32 (mmio_conf0
, conf0_val
.dw
);
420 // A0 BIOS Spec doesn't mention it although X0 does. comment out now.
421 // GPIO SCORE write 0x01001002 to IOBASE + 0x0900
427 SpiBiosProtectionFunction(
433 UINTN mPciD31F0RegBase
;
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;
446 BiosFlaLower1
= PcdGet32(PcdFlashFvMainBase
)-PcdGet32(PcdFlashAreaBaseAddress
);
447 BiosFlaLimit1
= (PcdGet32(PcdFlashFvRecoveryBase
)-PcdGet32(PcdFlashFvMainBase
)+PcdGet32(PcdFlashFvRecoverySize
))-1;
451 mPciD31F0RegBase
= MmPciAddress (0,
452 DEFAULT_PCI_BUS_NUMBER_PCH
,
453 PCI_DEVICE_NUMBER_PCH_LPC
,
454 PCI_FUNCTION_NUMBER_PCH_LPC
,
457 SpiBase
= MmioRead32(mPciD31F0RegBase
+ R_PCH_LPC_SPI_BASE
) & B_PCH_LPC_SPI_BASE_BAR
;
460 //Set SMM_BWP, WPD and LE bit
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
);
467 //First check if FLOCKDN or PR0FLOCKDN is set. No action if either of them set already.
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) {
472 //Already locked. we could take no action here
474 DEBUG((EFI_D_INFO
, "PR0 already locked down. Stop configuring PR0.\n"));
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));
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));
496 MmioOr16 ((UINTN
) (SpiBase
+ R_PCH_SPI_HSFS
), (UINT16
) (B_PCH_SPI_HSFS_FLOCKDN
));
499 // Verify if it's really locked.
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"));
517 VarSize
= sizeof(SYSTEM_CONFIGURATION
);
520 &gEfiNormalSetupGuid
,
523 &mSystemConfiguration
529 PchAzaliaPciCfg32Or (R_PCH_HDA_PCS
, B_PCH_HDA_PCS_PMEE
);
532 //Program SATA PME_EN
534 PchSataPciCfg32Or (R_PCH_SATA_PMCS
, B_PCH_SATA_PMCS_PMEE
);
536 DEBUG ((EFI_D_INFO
, "InitPciDevPME mSystemConfiguration.EhciPllCfgEnable = 0x%x \n",mSystemConfiguration
.EhciPllCfgEnable
));
537 if (mSystemConfiguration
.EhciPllCfgEnable
!= 1) {
539 //Program EHCI PME_EN
544 PCI_DEVICE_NUMBER_PCH_USB
,
545 PCI_FUNCTION_NUMBER_PCH_EHCI
,
546 R_PCH_EHCI_PWR_CNTL_STS
,
547 B_PCH_EHCI_PWR_CNTL_STS_PME_EN
554 EhciPciMmBase
= MmPciAddress (0,
556 PCI_DEVICE_NUMBER_PCH_USB
,
557 PCI_FUNCTION_NUMBER_PCH_EHCI
,
560 DEBUG ((EFI_D_INFO
, "ConfigureAdditionalPm() EhciPciMmBase = 0x%x \n",EhciPciMmBase
));
561 Buffer32
= MmioRead32(EhciPciMmBase
+ R_PCH_EHCI_PWR_CNTL_STS
);
562 DEBUG ((EFI_D_INFO
, "ConfigureAdditionalPm() R_PCH_EHCI_PWR_CNTL_STS = 0x%x \n",Buffer32
));
574 EFI_GLOBAL_NVS_AREA_PROTOCOL
*GlobalNvsArea
;
575 VarSize
= sizeof(SYSTEM_CONFIGURATION
);
578 &gEfiNormalSetupGuid
,
581 &mSystemConfiguration
583 gBS
->LocateProtocol (
584 &gEfiGlobalNvsAreaProtocolGuid
,
586 (void **)&GlobalNvsArea
588 GlobalNvsArea
->Area
->CriticalThermalTripPoint
= mSystemConfiguration
.CriticalThermalTripPoint
;
589 GlobalNvsArea
->Area
->PassiveThermalTripPoint
= mSystemConfiguration
.PassiveThermalTripPoint
;
591 #if defined SUPPORT_LVDS_DISPLAY && SUPPORT_LVDS_DISPLAY
598 TristateLpcGpioS0i3Config (
599 UINT32 Gpio_Mmio_Offset
,
601 CFIO_PNP_INIT
* Gpio_Conf_Data
609 DEBUG ((DEBUG_INFO
, "TristateLpcGpioS0i3Config\n"));
611 for(index
=0; index
< Gpio_Pin_Num
; index
++)
613 mmio_reg
= IO_BASE_ADDRESS
+ Gpio_Mmio_Offset
+ Gpio_Conf_Data
[index
].offset
;
615 MmioWrite32(mmio_reg
, Gpio_Conf_Data
[index
].val
);
617 mmio_val
= MmioRead32(mmio_reg
);
619 DEBUG ((EFI_D_INFO
, "Set MMIO=0x%08x PAD_VAL = 0x%08x,\n", mmio_reg
, mmio_val
));
626 EFI_BOOT_SCRIPT_SAVE_PROTOCOL
*mBootScriptSave
;
629 Event Notification during exit boot service to enabel ACPI mode
631 Disable SW SMI Timer, SMI from USB & Intel Specific USB 2
633 Clear all ACPI event status and disable all ACPI events
634 Disable PM sources except power button
637 Guarantee day-of-month alarm is invalid (ACPI 5.0 Section 4.8.2.4 "Real Time Clock Alarm")
639 Update EC to disable SMI and enable SCI
643 Enable PME_B0_EN in GPE0a_EN
645 @param Event - EFI Event Handle
646 @param Context - Pointer to Notify Context
663 AcpiBase
= MmioRead16 (
664 PchPciDeviceMmBase (DEFAULT_PCI_BUS_NUMBER_PCH
,
665 PCI_DEVICE_NUMBER_PCH_LPC
,
666 PCI_FUNCTION_NUMBER_PCH_LPC
) + R_PCH_LPC_ACPI_BASE
667 ) & B_PCH_LPC_ACPI_BASE_BAR
;
669 DEBUG ((EFI_D_INFO
, "EnableAcpiCallback: AcpiBase = %x\n", AcpiBase
));
672 // Disable SW SMI Timer, SMI from USB & Intel Specific USB 2
674 RegData32
= IoRead32(AcpiBase
+ R_PCH_SMI_EN
);
675 RegData32
&= ~(B_PCH_SMI_EN_SWSMI_TMR
| B_PCH_SMI_EN_LEGACY_USB2
| B_PCH_SMI_EN_INTEL_USB2
);
676 IoWrite32(AcpiBase
+ R_PCH_SMI_EN
, RegData32
);
678 RegData32
= IoRead32(AcpiBase
+ R_PCH_SMI_STS
);
679 RegData32
|= B_PCH_SMI_STS_SWSMI_TMR
;
680 IoWrite32(AcpiBase
+ R_PCH_SMI_STS
, RegData32
);
683 // Disable PM sources except power button
684 // power button is enabled only for PCAT. Disabled it on Tablet platform
687 IoWrite16(AcpiBase
+ R_PCH_ACPI_PM1_EN
, B_PCH_ACPI_PM1_EN_PWRBTN
);
688 IoWrite16(AcpiBase
+ R_PCH_ACPI_PM1_STS
, 0xffff);
691 // Guarantee day-of-month alarm is invalid (ACPI 5.0 Section 4.8.2.4 "Real Time Clock Alarm")
692 // Clear Status D reg VM bit, Date of month Alarm to make Data in CMOS RAM is no longer Valid
694 IoWrite8 (PCAT_RTC_ADDRESS_REGISTER
, RTC_ADDRESS_REGISTER_D
);
695 IoWrite8 (PCAT_RTC_DATA_REGISTER
, 0x0);
697 RegData32
= IoRead32(AcpiBase
+ R_PCH_ALT_GP_SMI_EN
);
698 RegData32
&= ~(BIT7
);
699 IoWrite32((AcpiBase
+ R_PCH_ALT_GP_SMI_EN
), RegData32
);
704 Pm1Cnt
= IoRead16(AcpiBase
+ R_PCH_ACPI_PM1_CNT
);
705 Pm1Cnt
|= B_PCH_ACPI_PM1_CNT_SCI_EN
;
706 IoWrite16(AcpiBase
+ R_PCH_ACPI_PM1_CNT
, Pm1Cnt
);
708 IoWrite8(0x80, 0xA0); //SW_SMI_ACPI_ENABLE
711 // Enable PME_B0_EN in GPE0a_EN
712 // Caution: Enable PME_B0_EN must be placed after enabling SCI.
713 // Otherwise, USB PME could not be handled as SMI event since no handler is there.
715 Gpe0aEn
= IoRead32 (AcpiBase
+ R_PCH_ACPI_GPE0a_EN
);
716 Gpe0aEn
|= B_PCH_ACPI_GPE0a_EN_PME_B0
;
717 IoWrite32(AcpiBase
+ R_PCH_ACPI_GPE0a_EN
, Gpe0aEn
);
725 This is the standard EFI driver point for the Driver. This
726 driver is responsible for setting up any platform specific policy or
727 initialization information.
729 @param ImageHandle Handle for the image of this driver.
730 @param SystemTable Pointer to the EFI System Table.
732 @retval EFI_SUCCESS Policy decisions set.
738 IN EFI_HANDLE ImageHandle
,
739 IN EFI_SYSTEM_TABLE
*SystemTable
744 EFI_HANDLE Handle
= NULL
;
745 EFI_EVENT mEfiExitBootServicesEvent
;
747 VOID
*RtcCallbackReg
= NULL
;
749 mImageHandle
= ImageHandle
;
751 Status
= gBS
->InstallProtocolInterface (
753 &gEfiSpeakerInterfaceProtocolGuid
,
754 EFI_NATIVE_INTERFACE
,
758 Status
= gBS
->LocateProtocol (
759 &gEfiPciRootBridgeIoProtocolGuid
,
761 (VOID
**) &mPciRootBridgeIo
763 ASSERT_EFI_ERROR (Status
);
765 VarSize
= sizeof(EFI_PLATFORM_INFO_HOB
);
766 Status
= gRT
->GetVariable(
768 &gEfiVlv2VariableGuid
,
775 // Initialize Product Board ID variable
777 InitMfgAndConfigModeStateVar();
778 InitPlatformBootMode();
781 // Install Observable protocol
783 InitializeObservableProtocol();
785 Status
= SaveSetupRecoveryVar();
786 if (EFI_ERROR (Status
)) {
787 DEBUG ((EFI_D_ERROR
, "InitializePlatform() Save SetupRecovery variable failed \n"));
790 VarSize
= sizeof(SYSTEM_CONFIGURATION
);
791 Status
= gRT
->GetVariable(
793 &gEfiNormalSetupGuid
,
796 &mSystemConfiguration
798 if (EFI_ERROR (Status
) || VarSize
!= sizeof(SYSTEM_CONFIGURATION
)) {
799 //The setup variable is corrupted
800 VarSize
= sizeof(SYSTEM_CONFIGURATION
);
801 Status
= gRT
->GetVariable(
803 &gEfiNormalSetupGuid
,
806 &mSystemConfiguration
808 ASSERT_EFI_ERROR (Status
);
809 Status
= gRT
->SetVariable (
811 &gEfiNormalSetupGuid
,
812 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
813 sizeof(SYSTEM_CONFIGURATION
),
814 &mSystemConfiguration
818 Status
= EfiCreateEventReadyToBootEx (
826 // Create a ReadyToBoot Event to run the PME init process
828 Status
= EfiCreateEventReadyToBootEx (
835 // Create a ReadyToBoot Event to run enable PR0/PR1 and lock down,unlock variable region
837 if(mSystemConfiguration
.SpiRwProtect
==1) {
838 Status
= EfiCreateEventReadyToBootEx (
840 SpiBiosProtectionFunction
,
846 // Create a ReadyToBoot Event to run the thermalzone init process
848 Status
= EfiCreateEventReadyToBootEx (
857 EFI_COMPUTING_UNIT_CHIPSET
| EFI_CU_PLATFORM_DXE_STEP1
,
865 #if defined(SENSOR_INFO_VAR_SUPPORT) && SENSOR_INFO_VAR_SUPPORT != 0
867 // Initialize Sensor Info variable
869 InitializeSensorInfoVariable();
871 InitPchPlatformPolicy(&mPlatformInfo
);
872 InitVlvPlatformPolicy();
877 InitPlatformUsbPolicy();
878 InitSioPlatformPolicy();
879 InitializeClockRouting();
880 InitializeSlotInfo();
890 EFI_COMPUTING_UNIT_CHIPSET
| EFI_CU_PLATFORM_DXE_STEP2
,
899 // Install PCI Bus Driver Hook
907 EFI_COMPUTING_UNIT_CHIPSET
| EFI_CU_PLATFORM_DXE_STEP3
,
917 // Initialize Password States and Callbacks
921 #if defined SUPPORT_LVDS_DISPLAY && SUPPORT_LVDS_DISPLAY
925 #if defined(FIRMWARE_ID_BACKWARD_COMPATIBLE) && (FIRMWARE_ID_BACKWARD_COMPATIBLE != 0)
927 // Re-write Firmware ID if it is changed
934 EFI_COMPUTING_UNIT_CHIPSET
| EFI_CU_PLATFORM_DXE_STEP4
,
943 Status
= gBS
->CreateEventEx (
948 &gEfiEventExitBootServicesGuid
,
949 &mEfiExitBootServicesEvent
953 // Adjust RTC deafult time to be BIOS-built time.
955 Status
= gBS
->CreateEvent (
958 AdjustDefaultRtcTimeCallback
,
962 if (!EFI_ERROR (Status
)) {
963 Status
= gBS
->RegisterProtocolNotify (
964 &gExitPmAuthProtocolGuid
,
975 Source Or Destination with Length bytes.
977 @param[in] Destination Target memory
978 @param[in] Source Source memory
979 @param[in] Length Number of bytes
986 IN VOID
*Destination
,
994 if (Source
< Destination
) {
995 Destination8
= (CHAR8
*) Destination
+ Length
- 1;
996 Source8
= (CHAR8
*) Source
+ Length
- 1;
998 *(Destination8
--) |= *(Source8
--);
1001 Destination8
= (CHAR8
*) Destination
;
1002 Source8
= (CHAR8
*) Source
;
1004 *(Destination8
++) |= *(Source8
++);
1013 // Saved SPI Opcode menu to fix EFI variable unable to write after S3 resume.
1015 S3BootScriptSaveMemWrite (
1016 EfiBootScriptWidthUint32
,
1017 (UINTN
)(SPI_BASE_ADDRESS
+ (R_PCH_SPI_OPMENU0
)),
1019 (VOID
*)(UINTN
)(SPI_BASE_ADDRESS
+ (R_PCH_SPI_OPMENU0
)));
1021 S3BootScriptSaveMemWrite (
1022 EfiBootScriptWidthUint32
,
1023 (UINTN
)(SPI_BASE_ADDRESS
+ (R_PCH_SPI_OPMENU1
)),
1025 (VOID
*)(UINTN
)(SPI_BASE_ADDRESS
+ (R_PCH_SPI_OPMENU1
)));
1027 S3BootScriptSaveMemWrite (
1028 EfiBootScriptWidthUint16
,
1029 (UINTN
)(SPI_BASE_ADDRESS
+ R_PCH_SPI_OPTYPE
),
1031 (VOID
*)(UINTN
)(SPI_BASE_ADDRESS
+ R_PCH_SPI_OPTYPE
));
1033 S3BootScriptSaveMemWrite (
1034 EfiBootScriptWidthUint16
,
1035 (UINTN
)(SPI_BASE_ADDRESS
+ R_PCH_SPI_PREOP
),
1037 (VOID
*)(UINTN
)(SPI_BASE_ADDRESS
+ R_PCH_SPI_PREOP
));
1040 // Saved MTPMC_1 for S3 resume.
1042 S3BootScriptSaveMemWrite (
1043 EfiBootScriptWidthUint32
,
1044 (UINTN
)(PMC_BASE_ADDRESS
+ R_PCH_PMC_MTPMC1
),
1046 (VOID
*)(UINTN
)(PMC_BASE_ADDRESS
+ R_PCH_PMC_MTPMC1
));
1052 ReadyToBootFunction (
1058 EFI_ISA_ACPI_PROTOCOL
*IsaAcpi
;
1059 EFI_ISA_ACPI_DEVICE_ID IsaDevice
;
1062 EFI_TPM_MP_DRIVER_PROTOCOL
*TpmMpDriver
;
1063 EFI_CPU_IO_PROTOCOL
*CpuIo
;
1065 UINT8 ReceiveBuffer
[64];
1066 UINT32 ReceiveBufferSize
;
1068 UINT8 TpmForceClearCommand
[] = {0x00, 0xC1,
1069 0x00, 0x00, 0x00, 0x0A,
1070 0x00, 0x00, 0x00, 0x5D};
1071 UINT8 TpmPhysicalPresenceCommand
[] = {0x00, 0xC1,
1072 0x00, 0x00, 0x00, 0x0C,
1073 0x40, 0x00, 0x00, 0x0A,
1075 UINT8 TpmPhysicalDisableCommand
[] = {0x00, 0xC1,
1076 0x00, 0x00, 0x00, 0x0A,
1077 0x00, 0x00, 0x00, 0x70};
1078 UINT8 TpmPhysicalEnableCommand
[] = {0x00, 0xC1,
1079 0x00, 0x00, 0x00, 0x0A,
1080 0x00, 0x00, 0x00, 0x6F};
1081 UINT8 TpmPhysicalSetDeactivatedCommand
[] = {0x00, 0xC1,
1082 0x00, 0x00, 0x00, 0x0B,
1083 0x00, 0x00, 0x00, 0x72,
1085 UINT8 TpmSetOwnerInstallCommand
[] = {0x00, 0xC1,
1086 0x00, 0x00, 0x00, 0x0B,
1087 0x00, 0x00, 0x00, 0x71,
1090 Size
= sizeof(UINT16
);
1091 Status
= gRT
->GetVariable (
1092 VAR_EQ_FLOPPY_MODE_DECIMAL_NAME
,
1093 &gEfiNormalSetupGuid
,
1100 // Disable Floppy Controller if needed
1102 Status
= gBS
->LocateProtocol (&gEfiIsaAcpiProtocolGuid
, NULL
, (VOID
**) &IsaAcpi
);
1103 if (!EFI_ERROR(Status
) && (State
== 0x00)) {
1104 IsaDevice
.HID
= EISA_PNP_ID(0x604);
1106 Status
= IsaAcpi
->EnableDevice(IsaAcpi
, &IsaDevice
, FALSE
);
1110 // save LAN info to a variable
1112 if (NULL
!= mPciLanInfo
) {
1115 &gEfiPciLanInfoGuid
,
1116 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
,
1117 mPciLanCount
* sizeof(PCI_LAN_INFO
),
1122 if (NULL
!= mPciLanInfo
) {
1123 gBS
->FreePool (mPciLanInfo
);
1129 // Handle ACPI OS TPM requests here
1131 Status
= gBS
->LocateProtocol (
1132 &gEfiCpuIoProtocolGuid
,
1136 Status
= gBS
->LocateProtocol (
1137 &gEfiTpmMpDriverProtocolGuid
,
1139 (VOID
**)&TpmMpDriver
1141 if (!EFI_ERROR (Status
))
1143 Data
= ReadCmosBank1Byte (CpuIo
, ACPI_TPM_REQUEST
);
1146 // Clear pending ACPI TPM request indicator
1148 WriteCmosBank1Byte (CpuIo
, ACPI_TPM_REQUEST
, 0x00);
1151 WriteCmosBank1Byte (CpuIo
, ACPI_TPM_LAST_REQUEST
, Data
);
1154 // Assert Physical Presence for these commands
1156 TpmPhysicalPresenceCommand
[11] = 0x20;
1157 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1158 Status
= TpmMpDriver
->Transmit (
1159 TpmMpDriver
, TpmPhysicalPresenceCommand
,
1160 sizeof (TpmPhysicalPresenceCommand
),
1161 ReceiveBuffer
, &ReceiveBufferSize
1164 // PF PhysicalPresence = TRUE
1166 TpmPhysicalPresenceCommand
[11] = 0x08;
1167 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1168 Status
= TpmMpDriver
->Transmit (
1169 TpmMpDriver
, TpmPhysicalPresenceCommand
,
1170 sizeof (TpmPhysicalPresenceCommand
),
1177 // TPM_PhysicalEnable
1179 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1180 Status
= TpmMpDriver
->Transmit (
1181 TpmMpDriver
, TpmPhysicalEnableCommand
,
1182 sizeof (TpmPhysicalEnableCommand
),
1183 ReceiveBuffer
, &ReceiveBufferSize
1189 // TPM_PhysicalDisable
1191 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1192 Status
= TpmMpDriver
->Transmit (
1193 TpmMpDriver
, TpmPhysicalDisableCommand
,
1194 sizeof (TpmPhysicalDisableCommand
),
1202 // TPM_PhysicalSetDeactivated=FALSE
1204 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1205 TpmPhysicalSetDeactivatedCommand
[10] = 0x00;
1206 Status
= TpmMpDriver
->Transmit (
1208 TpmPhysicalSetDeactivatedCommand
,
1209 sizeof (TpmPhysicalSetDeactivatedCommand
),
1210 ReceiveBuffer
, &ReceiveBufferSize
1212 gRT
->ResetSystem (EfiResetWarm
, EFI_SUCCESS
, 0, NULL
);
1217 // TPM_PhysicalSetDeactivated=TRUE
1219 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1220 TpmPhysicalSetDeactivatedCommand
[10] = 0x01;
1221 Status
= TpmMpDriver
->Transmit (
1223 TpmPhysicalSetDeactivatedCommand
,
1224 sizeof (TpmPhysicalSetDeactivatedCommand
),
1240 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1241 Status
= TpmMpDriver
->Transmit (
1243 TpmForceClearCommand
,
1244 sizeof (TpmForceClearCommand
),
1258 // TPM_PhysicalEnable
1260 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1261 Status
= TpmMpDriver
->Transmit (
1263 TpmPhysicalEnableCommand
,
1264 sizeof (TpmPhysicalEnableCommand
),
1269 // TPM_PhysicalSetDeactivated=FALSE
1271 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1272 TpmPhysicalSetDeactivatedCommand
[10] = 0x00;
1273 Status
= TpmMpDriver
->Transmit (
1275 TpmPhysicalSetDeactivatedCommand
,
1276 sizeof (TpmPhysicalSetDeactivatedCommand
),
1290 // TPM_PhysicalSetDeactivated=TRUE
1292 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1293 TpmPhysicalSetDeactivatedCommand
[10] = 0x01;
1294 Status
= TpmMpDriver
->Transmit (
1296 TpmPhysicalSetDeactivatedCommand
,
1297 sizeof (TpmPhysicalSetDeactivatedCommand
),
1302 // TPM_PhysicalDisable
1304 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1305 Status
= TpmMpDriver
->Transmit (
1307 TpmPhysicalDisableCommand
,
1308 sizeof (TpmPhysicalDisableCommand
),
1322 // TPM_SetOwnerInstall=TRUE
1324 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1325 TpmSetOwnerInstallCommand
[10] = 0x01;
1326 Status
= TpmMpDriver
->Transmit (
1328 TpmSetOwnerInstallCommand
,
1329 sizeof (TpmSetOwnerInstallCommand
),
1337 // TPM_SetOwnerInstall=FALSE
1339 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1340 TpmSetOwnerInstallCommand
[10] = 0x00;
1341 Status
= TpmMpDriver
->Transmit (
1343 TpmSetOwnerInstallCommand
,
1344 sizeof (TpmSetOwnerInstallCommand
),
1352 // TPM_PhysicalEnable
1354 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1355 Status
= TpmMpDriver
->Transmit (
1357 TpmPhysicalEnableCommand
,
1358 sizeof (TpmPhysicalEnableCommand
),
1363 // TPM_PhysicalSetDeactivated=FALSE
1365 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1366 TpmPhysicalSetDeactivatedCommand
[10] = 0x00;
1367 Status
= TpmMpDriver
->Transmit (
1369 TpmPhysicalSetDeactivatedCommand
,
1370 sizeof (TpmPhysicalSetDeactivatedCommand
),
1375 // Do TPM_SetOwnerInstall=TRUE on next reboot
1378 WriteCmosBank1Byte (CpuIo
, ACPI_TPM_REQUEST
, 0xF0);
1390 // TPM_SetOwnerInstall=FALSE
1392 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1393 TpmSetOwnerInstallCommand
[10] = 0x00;
1394 Status
= TpmMpDriver
->Transmit (
1396 TpmSetOwnerInstallCommand
,
1397 sizeof (TpmSetOwnerInstallCommand
),
1402 // TPM_PhysicalSetDeactivated=TRUE
1404 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1405 TpmPhysicalSetDeactivatedCommand
[10] = 0x01;
1406 Status
= TpmMpDriver
->Transmit (
1408 TpmPhysicalSetDeactivatedCommand
,
1409 sizeof (TpmPhysicalSetDeactivatedCommand
),
1414 // TPM_PhysicalDisable
1416 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1417 Status
= TpmMpDriver
->Transmit (
1419 TpmPhysicalDisableCommand
,
1420 sizeof (TpmPhysicalDisableCommand
),
1436 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1437 Status
= TpmMpDriver
->Transmit (
1439 TpmForceClearCommand
,
1440 sizeof (TpmForceClearCommand
),
1445 // TPM_PhysicalEnable
1447 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1448 Status
= TpmMpDriver
->Transmit (
1450 TpmPhysicalEnableCommand
,
1451 sizeof (TpmPhysicalEnableCommand
),
1456 // TPM_PhysicalSetDeactivated=FALSE
1458 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1459 TpmPhysicalSetDeactivatedCommand
[10] = 0x00;
1460 Status
= TpmMpDriver
->Transmit (
1462 TpmPhysicalSetDeactivatedCommand
,
1463 sizeof (TpmPhysicalSetDeactivatedCommand
),
1477 // Second part of ACPI TPM request 0x0A: OEM custom TPM_SetOwnerInstall=TRUE
1479 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1480 TpmSetOwnerInstallCommand
[10] = 0x01;
1481 Status
= TpmMpDriver
->Transmit (
1483 TpmSetOwnerInstallCommand
,
1484 sizeof (TpmSetOwnerInstallCommand
),
1488 WriteCmosBank1Byte (CpuIo
, ACPI_TPM_LAST_REQUEST
, 0x0A);
1491 // Deassert Physical Presence
1493 TpmPhysicalPresenceCommand
[11] = 0x10;
1494 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1495 Status
= TpmMpDriver
->Transmit (
1497 TpmPhysicalPresenceCommand
,
1498 sizeof (TpmPhysicalPresenceCommand
),
1510 Initializes manufacturing and config mode setting.
1514 InitMfgAndConfigModeStateVar()
1516 EFI_PLATFORM_SETUP_ID
*BootModeBuffer
;
1520 HobList
= GetFirstGuidHob(&gEfiPlatformBootModeGuid
);
1521 if (HobList
!= NULL
) {
1522 BootModeBuffer
= GET_GUID_HOB_DATA (HobList
);
1525 // Check if in Manufacturing mode
1528 &BootModeBuffer
->SetupName
,
1529 MANUFACTURE_SETUP_NAME
,
1530 StrSize (MANUFACTURE_SETUP_NAME
)
1543 Initializes manufacturing and config mode setting.
1547 InitPlatformBootMode()
1549 EFI_PLATFORM_SETUP_ID
*BootModeBuffer
;
1552 HobList
= GetFirstGuidHob(&gEfiPlatformBootModeGuid
);
1553 if (HobList
!= NULL
) {
1554 BootModeBuffer
= GET_GUID_HOB_DATA (HobList
);
1555 mPlatformBootMode
= BootModeBuffer
->PlatformBootMode
;
1569 UINT16 ItkModBiosState
;
1575 // Setup local variable according to ITK variable
1578 // Read ItkBiosModVar to determine if BIOS has been modified by ITK
1579 // If ItkBiosModVar = 0 or if variable hasn't been initialized then BIOS has not been modified by ITK modified
1580 // Set local variable VAR_EQ_ITK_BIOS_MOD_DECIMAL_NAME=0 if BIOS has not been modified by ITK
1582 DataSize
= sizeof (Value
);
1583 Status
= gRT
->GetVariable (
1584 ITK_BIOS_MOD_VAR_NAME
,
1590 if (Status
== EFI_NOT_FOUND
) {
1592 // Variable not found, hasn't been initialized, intialize to 0
1596 // Write variable to flash.
1599 ITK_BIOS_MOD_VAR_NAME
,
1601 EFI_VARIABLE_RUNTIME_ACCESS
|
1602 EFI_VARIABLE_NON_VOLATILE
|
1603 EFI_VARIABLE_BOOTSERVICE_ACCESS
,
1609 if ( (!EFI_ERROR (Status
)) || (Status
== EFI_NOT_FOUND
) ) {
1610 if (Value
== 0x00) {
1611 ItkModBiosState
= 0x00;
1613 ItkModBiosState
= 0x01;
1616 VAR_EQ_ITK_BIOS_MOD_DECIMAL_NAME
,
1617 &gEfiNormalSetupGuid
,
1618 EFI_VARIABLE_BOOTSERVICE_ACCESS
,
1620 (void *)&ItkModBiosState
1625 #if defined(FIRMWARE_ID_BACKWARD_COMPATIBLE) && (FIRMWARE_ID_BACKWARD_COMPATIBLE != 0)
1629 Initializes the BIOS FIRMWARE ID from the FIRMWARE_ID build variable.
1638 CHAR16 FirmwareIdNameWithPassword
[] = FIRMWARE_ID_NAME_WITH_PASSWORD
;
1641 // First try writing the variable without a password in case we are
1642 // upgrading from a BIOS without password protection on the FirmwareId
1644 Status
= gRT
->SetVariable(
1645 (CHAR16
*)&gFirmwareIdName
,
1647 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
|
1648 EFI_VARIABLE_RUNTIME_ACCESS
,
1649 sizeof( FIRMWARE_ID
) - 1,
1653 if (Status
== EFI_INVALID_PARAMETER
) {
1656 // Since setting the firmware id without the password failed,
1657 // a password must be required.
1659 Status
= gRT
->SetVariable(
1660 (CHAR16
*)&FirmwareIdNameWithPassword
,
1662 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
|
1663 EFI_VARIABLE_RUNTIME_ACCESS
,
1664 sizeof( FIRMWARE_ID
) - 1,
1676 // Workaround to support IIA bug.
1677 // IIA request to change option value to 4, 5 and 7 relatively
1678 // instead of 1, 2, and 3 which follow Lakeport Specs.
1679 // Check option value, temporary hardcode GraphicsDriverMemorySize
1680 // Option value to fulfill IIA requirment. So that user no need to
1681 // load default and update setupvariable after update BIOS.
1682 // Option value hardcoded as: 1 to 4, 2 to 5, 3 to 7.
1683 // *This is for broadwater and above product only.
1686 SYSTEM_CONFIGURATION SystemConfiguration
;
1690 VarSize
= sizeof(SYSTEM_CONFIGURATION
);
1691 Status
= gRT
->GetVariable(
1693 &gEfiNormalSetupGuid
,
1696 &SystemConfiguration
1699 if (EFI_ERROR (Status
) || VarSize
!= sizeof(SYSTEM_CONFIGURATION
)) {
1700 //The setup variable is corrupted
1701 VarSize
= sizeof(SYSTEM_CONFIGURATION
);
1702 Status
= gRT
->GetVariable(
1704 &gEfiNormalSetupGuid
,
1707 &SystemConfiguration
1709 ASSERT_EFI_ERROR (Status
);
1712 if((SystemConfiguration
.GraphicsDriverMemorySize
< 4) && !EFI_ERROR(Status
) ) {
1713 switch (SystemConfiguration
.GraphicsDriverMemorySize
){
1715 SystemConfiguration
.GraphicsDriverMemorySize
= 4;
1718 SystemConfiguration
.GraphicsDriverMemorySize
= 5;
1721 SystemConfiguration
.GraphicsDriverMemorySize
= 7;
1727 Status
= gRT
->SetVariable (
1729 &gEfiNormalSetupGuid
,
1730 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
1731 sizeof(SYSTEM_CONFIGURATION
),
1732 &SystemConfiguration
1738 InitPlatformUsbPolicy (
1748 mUsbPolicyData
.Version
= (UINT8
)USB_POLICY_PROTOCOL_REVISION_2
;
1749 mUsbPolicyData
.UsbMassStorageEmulationType
= mSystemConfiguration
.UsbBIOSINT13DeviceEmulation
;
1750 if(mUsbPolicyData
.UsbMassStorageEmulationType
== 3) {
1751 mUsbPolicyData
.UsbEmulationSize
= mSystemConfiguration
.UsbBIOSINT13DeviceEmulationSize
;
1753 mUsbPolicyData
.UsbEmulationSize
= 0;
1755 mUsbPolicyData
.UsbZipEmulationType
= mSystemConfiguration
.UsbZipEmulation
;
1756 mUsbPolicyData
.UsbOperationMode
= HIGH_SPEED
;
1759 // Some chipset need Period smi, 0 = LEGACY_PERIOD_UN_SUPP
1761 mUsbPolicyData
.USBPeriodSupport
= LEGACY_PERIOD_UN_SUPP
;
1764 // Some platform need legacyfree, 0 = LEGACY_FREE_UN_SUPP
1766 mUsbPolicyData
.LegacyFreeSupport
= LEGACY_FREE_UN_SUPP
;
1769 // Set Code base , TIANO_CODE_BASE =0x01, ICBD =0x00
1771 mUsbPolicyData
.CodeBase
= (UINT8
)ICBD_CODE_BASE
;
1774 // Some chispet 's LpcAcpibase are diffrent,set by platform or chipset,
1775 // default is Ich acpibase =0x040. acpitimerreg=0x08.
1776 mUsbPolicyData
.LpcAcpiBase
= 0x40;
1777 mUsbPolicyData
.AcpiTimerReg
= 0x08;
1780 // Set for reduce usb post time
1782 mUsbPolicyData
.UsbTimeTue
= 0x00;
1783 mUsbPolicyData
.InternelHubExist
= 0x00; //TigerPoint doesn't have RMH
1784 mUsbPolicyData
.EnumWaitPortStableStall
= 100;
1787 Status
= gBS
->InstallProtocolInterface (
1790 EFI_NATIVE_INTERFACE
,
1793 ASSERT_EFI_ERROR(Status
);
1799 IN EFI_CPU_IO_PROTOCOL
*CpuIo
,
1805 CpuIo
->Io
.Write (CpuIo
, EfiCpuIoWidthUint8
, 0x72, 1, &Index
);
1806 CpuIo
->Io
.Read (CpuIo
, EfiCpuIoWidthUint8
, 0x73, 1, &Data
);
1811 WriteCmosBank1Byte (
1812 IN EFI_CPU_IO_PROTOCOL
*CpuIo
,