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));
488 MmioOr16 ((UINTN
) (SpiBase
+ R_PCH_SPI_HSFS
), (UINT16
) (B_PCH_SPI_HSFS_FLOCKDN
));
491 // Verify if it's really locked.
493 if ((MmioRead16 (SpiBase
+ R_PCH_SPI_HSFS
) & B_PCH_SPI_HSFS_FLOCKDN
) == 0) {
494 DEBUG((EFI_D_ERROR
, "Failed to lock down PR0.\n"));
501 MmioOr32((UINTN
)(SpiBase
+ R_PCH_SPI_PR1
),
502 B_PCH_SPI_PR1_RPE
|B_PCH_SPI_PR1_WPE
|\
503 (B_PCH_SPI_PR1_PRB_MASK
&(BiosFlaLower1
>>12))|(B_PCH_SPI_PR1_PRL_MASK
&(BiosFlaLimit1
>>12)<<16));
508 MmioOr16 ((UINTN
) (SpiBase
+ R_PCH_SPI_HSFS
), (UINT16
) (B_PCH_SPI_HSFS_FLOCKDN
));
511 // Verify if it's really locked.
513 if ((MmioRead16 (SpiBase
+ R_PCH_SPI_HSFS
) & B_PCH_SPI_HSFS_FLOCKDN
) == 0) {
514 DEBUG((EFI_D_ERROR
, "Failed to lock down PR1.\n"));
530 VarSize
= sizeof(SYSTEM_CONFIGURATION
);
531 Status
= gRT
->GetVariable(
533 &gEfiNormalSetupGuid
,
536 &mSystemConfiguration
542 PchAzaliaPciCfg32Or (R_PCH_HDA_PCS
, B_PCH_HDA_PCS_PMEE
);
545 //Program SATA PME_EN
547 PchSataPciCfg32Or (R_PCH_SATA_PMCS
, B_PCH_SATA_PMCS_PMEE
);
549 DEBUG ((EFI_D_INFO
, "InitPciDevPME mSystemConfiguration.EhciPllCfgEnable = 0x%x \n",mSystemConfiguration
.EhciPllCfgEnable
));
550 if (mSystemConfiguration
.EhciPllCfgEnable
!= 1) {
552 //Program EHCI PME_EN
557 PCI_DEVICE_NUMBER_PCH_USB
,
558 PCI_FUNCTION_NUMBER_PCH_EHCI
,
559 R_PCH_EHCI_PWR_CNTL_STS
,
560 B_PCH_EHCI_PWR_CNTL_STS_PME_EN
567 EhciPciMmBase
= MmPciAddress (0,
569 PCI_DEVICE_NUMBER_PCH_USB
,
570 PCI_FUNCTION_NUMBER_PCH_EHCI
,
573 DEBUG ((EFI_D_INFO
, "ConfigureAdditionalPm() EhciPciMmBase = 0x%x \n",EhciPciMmBase
));
574 Buffer32
= MmioRead32(EhciPciMmBase
+ R_PCH_EHCI_PWR_CNTL_STS
);
575 DEBUG ((EFI_D_INFO
, "ConfigureAdditionalPm() R_PCH_EHCI_PWR_CNTL_STS = 0x%x \n",Buffer32
));
579 #if defined SUPPORT_LVDS_DISPLAY && SUPPORT_LVDS_DISPLAY
586 TristateLpcGpioS0i3Config (
587 UINT32 Gpio_Mmio_Offset
,
589 CFIO_PNP_INIT
* Gpio_Conf_Data
597 DEBUG ((DEBUG_INFO
, "TristateLpcGpioS0i3Config\n"));
599 for(index
=0; index
< Gpio_Pin_Num
; index
++)
601 mmio_reg
= IO_BASE_ADDRESS
+ Gpio_Mmio_Offset
+ Gpio_Conf_Data
[index
].offset
;
603 MmioWrite32(mmio_reg
, Gpio_Conf_Data
[index
].val
);
605 mmio_val
= MmioRead32(mmio_reg
);
607 DEBUG ((EFI_D_INFO
, "Set MMIO=0x%08x PAD_VAL = 0x%08x,\n", mmio_reg
, mmio_val
));
614 EFI_BOOT_SCRIPT_SAVE_PROTOCOL
*mBootScriptSave
;
617 Event Notification during exit boot service to enabel ACPI mode
619 Disable SW SMI Timer, SMI from USB & Intel Specific USB 2
621 Clear all ACPI event status and disable all ACPI events
622 Disable PM sources except power button
625 Guarantee day-of-month alarm is invalid (ACPI 5.0 Section 4.8.2.4 "Real Time Clock Alarm")
627 Update EC to disable SMI and enable SCI
631 Enable PME_B0_EN in GPE0a_EN
633 @param Event - EFI Event Handle
634 @param Context - Pointer to Notify Context
651 AcpiBase
= MmioRead16 (
652 PchPciDeviceMmBase (DEFAULT_PCI_BUS_NUMBER_PCH
,
653 PCI_DEVICE_NUMBER_PCH_LPC
,
654 PCI_FUNCTION_NUMBER_PCH_LPC
) + R_PCH_LPC_ACPI_BASE
655 ) & B_PCH_LPC_ACPI_BASE_BAR
;
657 DEBUG ((EFI_D_INFO
, "EnableAcpiCallback: AcpiBase = %x\n", AcpiBase
));
660 // Disable SW SMI Timer, SMI from USB & Intel Specific USB 2
662 RegData32
= IoRead32(AcpiBase
+ R_PCH_SMI_EN
);
663 RegData32
&= ~(B_PCH_SMI_EN_SWSMI_TMR
| B_PCH_SMI_EN_LEGACY_USB2
| B_PCH_SMI_EN_INTEL_USB2
);
664 IoWrite32(AcpiBase
+ R_PCH_SMI_EN
, RegData32
);
666 RegData32
= IoRead32(AcpiBase
+ R_PCH_SMI_STS
);
667 RegData32
|= B_PCH_SMI_STS_SWSMI_TMR
;
668 IoWrite32(AcpiBase
+ R_PCH_SMI_STS
, RegData32
);
671 // Disable PM sources except power button
672 // power button is enabled only for PCAT. Disabled it on Tablet platform
675 IoWrite16(AcpiBase
+ R_PCH_ACPI_PM1_EN
, B_PCH_ACPI_PM1_EN_PWRBTN
);
676 IoWrite16(AcpiBase
+ R_PCH_ACPI_PM1_STS
, 0xffff);
679 // Guarantee day-of-month alarm is invalid (ACPI 5.0 Section 4.8.2.4 "Real Time Clock Alarm")
680 // Clear Status D reg VM bit, Date of month Alarm to make Data in CMOS RAM is no longer Valid
682 IoWrite8 (PCAT_RTC_ADDRESS_REGISTER
, RTC_ADDRESS_REGISTER_D
);
683 IoWrite8 (PCAT_RTC_DATA_REGISTER
, 0x0);
685 RegData32
= IoRead32(AcpiBase
+ R_PCH_ALT_GP_SMI_EN
);
686 RegData32
&= ~(BIT7
);
687 IoWrite32((AcpiBase
+ R_PCH_ALT_GP_SMI_EN
), RegData32
);
692 Pm1Cnt
= IoRead16(AcpiBase
+ R_PCH_ACPI_PM1_CNT
);
693 Pm1Cnt
|= B_PCH_ACPI_PM1_CNT_SCI_EN
;
694 IoWrite16(AcpiBase
+ R_PCH_ACPI_PM1_CNT
, Pm1Cnt
);
696 IoWrite8(0x80, 0xA0); //SW_SMI_ACPI_ENABLE
699 // Enable PME_B0_EN in GPE0a_EN
700 // Caution: Enable PME_B0_EN must be placed after enabling SCI.
701 // Otherwise, USB PME could not be handled as SMI event since no handler is there.
703 Gpe0aEn
= IoRead32 (AcpiBase
+ R_PCH_ACPI_GPE0a_EN
);
704 Gpe0aEn
|= B_PCH_ACPI_GPE0a_EN_PME_B0
;
705 IoWrite32(AcpiBase
+ R_PCH_ACPI_GPE0a_EN
, Gpe0aEn
);
713 This is the standard EFI driver point for the Driver. This
714 driver is responsible for setting up any platform specific policy or
715 initialization information.
717 @param ImageHandle Handle for the image of this driver.
718 @param SystemTable Pointer to the EFI System Table.
720 @retval EFI_SUCCESS Policy decisions set.
726 IN EFI_HANDLE ImageHandle
,
727 IN EFI_SYSTEM_TABLE
*SystemTable
732 EFI_HANDLE Handle
= NULL
;
733 EFI_EVENT mEfiExitBootServicesEvent
;
735 VOID
*RtcCallbackReg
= NULL
;
737 mImageHandle
= ImageHandle
;
739 Status
= gBS
->InstallProtocolInterface (
741 &gEfiSpeakerInterfaceProtocolGuid
,
742 EFI_NATIVE_INTERFACE
,
746 Status
= gBS
->LocateProtocol (
747 &gEfiPciRootBridgeIoProtocolGuid
,
749 (VOID
**) &mPciRootBridgeIo
751 ASSERT_EFI_ERROR (Status
);
753 VarSize
= sizeof(EFI_PLATFORM_INFO_HOB
);
754 Status
= gRT
->GetVariable(
756 &gEfiVlv2VariableGuid
,
763 // Initialize Product Board ID variable
765 InitMfgAndConfigModeStateVar();
766 InitPlatformBootMode();
769 // Install Observable protocol
771 InitializeObservableProtocol();
773 Status
= SaveSetupRecoveryVar();
774 if (EFI_ERROR (Status
)) {
775 DEBUG ((EFI_D_ERROR
, "InitializePlatform() Save SetupRecovery variable failed \n"));
778 VarSize
= sizeof(SYSTEM_CONFIGURATION
);
779 Status
= gRT
->GetVariable(
781 &gEfiNormalSetupGuid
,
784 &mSystemConfiguration
786 if (EFI_ERROR (Status
) || VarSize
!= sizeof(SYSTEM_CONFIGURATION
)) {
787 //The setup variable is corrupted
788 VarSize
= sizeof(SYSTEM_CONFIGURATION
);
789 Status
= gRT
->GetVariable(
791 &gEfiNormalSetupGuid
,
794 &mSystemConfiguration
796 ASSERT_EFI_ERROR (Status
);
797 Status
= gRT
->SetVariable (
799 &gEfiNormalSetupGuid
,
800 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
801 sizeof(SYSTEM_CONFIGURATION
),
802 &mSystemConfiguration
806 Status
= EfiCreateEventReadyToBootEx (
814 // Create a ReadyToBoot Event to run the PME init process
816 Status
= EfiCreateEventReadyToBootEx (
823 // Create a ReadyToBoot Event to run enable PR0/PR1 and lock down,unlock variable region
825 if(mSystemConfiguration
.SpiRwProtect
==1) {
826 Status
= EfiCreateEventReadyToBootEx (
828 SpiBiosProtectionFunction
,
836 EFI_COMPUTING_UNIT_CHIPSET
| EFI_CU_PLATFORM_DXE_STEP1
,
844 #if defined(SENSOR_INFO_VAR_SUPPORT) && SENSOR_INFO_VAR_SUPPORT != 0
846 // Initialize Sensor Info variable
848 InitializeSensorInfoVariable();
850 InitPchPlatformPolicy(&mPlatformInfo
);
851 InitVlvPlatformPolicy();
856 InitPlatformUsbPolicy();
857 InitSioPlatformPolicy();
858 InitializeClockRouting();
859 InitializeSlotInfo();
869 EFI_COMPUTING_UNIT_CHIPSET
| EFI_CU_PLATFORM_DXE_STEP2
,
878 // Install PCI Bus Driver Hook
886 EFI_COMPUTING_UNIT_CHIPSET
| EFI_CU_PLATFORM_DXE_STEP3
,
896 // Initialize Password States and Callbacks
900 #if defined SUPPORT_LVDS_DISPLAY && SUPPORT_LVDS_DISPLAY
904 #if defined(FIRMWARE_ID_BACKWARD_COMPATIBLE) && (FIRMWARE_ID_BACKWARD_COMPATIBLE != 0)
906 // Re-write Firmware ID if it is changed
913 EFI_COMPUTING_UNIT_CHIPSET
| EFI_CU_PLATFORM_DXE_STEP4
,
922 Status
= gBS
->CreateEventEx (
927 &gEfiEventExitBootServicesGuid
,
928 &mEfiExitBootServicesEvent
932 // Adjust RTC deafult time to be BIOS-built time.
934 Status
= gBS
->CreateEvent (
937 AdjustDefaultRtcTimeCallback
,
941 if (!EFI_ERROR (Status
)) {
942 Status
= gBS
->RegisterProtocolNotify (
943 &gExitPmAuthProtocolGuid
,
954 Source Or Destination with Length bytes.
956 @param[in] Destination Target memory
957 @param[in] Source Source memory
958 @param[in] Length Number of bytes
965 IN VOID
*Destination
,
973 if (Source
< Destination
) {
974 Destination8
= (CHAR8
*) Destination
+ Length
- 1;
975 Source8
= (CHAR8
*) Source
+ Length
- 1;
977 *(Destination8
--) |= *(Source8
--);
980 Destination8
= (CHAR8
*) Destination
;
981 Source8
= (CHAR8
*) Source
;
983 *(Destination8
++) |= *(Source8
++);
992 // Saved SPI Opcode menu to fix EFI variable unable to write after S3 resume.
994 S3BootScriptSaveMemWrite (
995 EfiBootScriptWidthUint32
,
996 (UINTN
)(SPI_BASE_ADDRESS
+ (R_PCH_SPI_OPMENU0
)),
998 (VOID
*)(UINTN
)(SPI_BASE_ADDRESS
+ (R_PCH_SPI_OPMENU0
)));
1000 S3BootScriptSaveMemWrite (
1001 EfiBootScriptWidthUint32
,
1002 (UINTN
)(SPI_BASE_ADDRESS
+ (R_PCH_SPI_OPMENU1
)),
1004 (VOID
*)(UINTN
)(SPI_BASE_ADDRESS
+ (R_PCH_SPI_OPMENU1
)));
1006 S3BootScriptSaveMemWrite (
1007 EfiBootScriptWidthUint16
,
1008 (UINTN
)(SPI_BASE_ADDRESS
+ R_PCH_SPI_OPTYPE
),
1010 (VOID
*)(UINTN
)(SPI_BASE_ADDRESS
+ R_PCH_SPI_OPTYPE
));
1012 S3BootScriptSaveMemWrite (
1013 EfiBootScriptWidthUint16
,
1014 (UINTN
)(SPI_BASE_ADDRESS
+ R_PCH_SPI_PREOP
),
1016 (VOID
*)(UINTN
)(SPI_BASE_ADDRESS
+ R_PCH_SPI_PREOP
));
1019 // Saved MTPMC_1 for S3 resume.
1021 S3BootScriptSaveMemWrite (
1022 EfiBootScriptWidthUint32
,
1023 (UINTN
)(PMC_BASE_ADDRESS
+ R_PCH_PMC_MTPMC1
),
1025 (VOID
*)(UINTN
)(PMC_BASE_ADDRESS
+ R_PCH_PMC_MTPMC1
));
1031 ReadyToBootFunction (
1037 EFI_ISA_ACPI_PROTOCOL
*IsaAcpi
;
1038 EFI_ISA_ACPI_DEVICE_ID IsaDevice
;
1041 EFI_TPM_MP_DRIVER_PROTOCOL
*TpmMpDriver
;
1042 EFI_CPU_IO_PROTOCOL
*CpuIo
;
1044 UINT8 ReceiveBuffer
[64];
1045 UINT32 ReceiveBufferSize
;
1047 UINT8 TpmForceClearCommand
[] = {0x00, 0xC1,
1048 0x00, 0x00, 0x00, 0x0A,
1049 0x00, 0x00, 0x00, 0x5D};
1050 UINT8 TpmPhysicalPresenceCommand
[] = {0x00, 0xC1,
1051 0x00, 0x00, 0x00, 0x0C,
1052 0x40, 0x00, 0x00, 0x0A,
1054 UINT8 TpmPhysicalDisableCommand
[] = {0x00, 0xC1,
1055 0x00, 0x00, 0x00, 0x0A,
1056 0x00, 0x00, 0x00, 0x70};
1057 UINT8 TpmPhysicalEnableCommand
[] = {0x00, 0xC1,
1058 0x00, 0x00, 0x00, 0x0A,
1059 0x00, 0x00, 0x00, 0x6F};
1060 UINT8 TpmPhysicalSetDeactivatedCommand
[] = {0x00, 0xC1,
1061 0x00, 0x00, 0x00, 0x0B,
1062 0x00, 0x00, 0x00, 0x72,
1064 UINT8 TpmSetOwnerInstallCommand
[] = {0x00, 0xC1,
1065 0x00, 0x00, 0x00, 0x0B,
1066 0x00, 0x00, 0x00, 0x71,
1069 Size
= sizeof(UINT16
);
1070 Status
= gRT
->GetVariable (
1071 VAR_EQ_FLOPPY_MODE_DECIMAL_NAME
,
1072 &gEfiNormalSetupGuid
,
1079 // Disable Floppy Controller if needed
1081 Status
= gBS
->LocateProtocol (&gEfiIsaAcpiProtocolGuid
, NULL
, (VOID
**) &IsaAcpi
);
1082 if (!EFI_ERROR(Status
) && (State
== 0x00)) {
1083 IsaDevice
.HID
= EISA_PNP_ID(0x604);
1085 Status
= IsaAcpi
->EnableDevice(IsaAcpi
, &IsaDevice
, FALSE
);
1089 // save LAN info to a variable
1091 if (NULL
!= mPciLanInfo
) {
1094 &gEfiPciLanInfoGuid
,
1095 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
,
1096 mPciLanCount
* sizeof(PCI_LAN_INFO
),
1101 if (NULL
!= mPciLanInfo
) {
1102 gBS
->FreePool (mPciLanInfo
);
1108 // Handle ACPI OS TPM requests here
1110 Status
= gBS
->LocateProtocol (
1111 &gEfiCpuIoProtocolGuid
,
1115 Status
= gBS
->LocateProtocol (
1116 &gEfiTpmMpDriverProtocolGuid
,
1118 (VOID
**)&TpmMpDriver
1120 if (!EFI_ERROR (Status
))
1122 Data
= ReadCmosBank1Byte (CpuIo
, ACPI_TPM_REQUEST
);
1125 // Clear pending ACPI TPM request indicator
1127 WriteCmosBank1Byte (CpuIo
, ACPI_TPM_REQUEST
, 0x00);
1130 WriteCmosBank1Byte (CpuIo
, ACPI_TPM_LAST_REQUEST
, Data
);
1133 // Assert Physical Presence for these commands
1135 TpmPhysicalPresenceCommand
[11] = 0x20;
1136 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1137 Status
= TpmMpDriver
->Transmit (
1138 TpmMpDriver
, TpmPhysicalPresenceCommand
,
1139 sizeof (TpmPhysicalPresenceCommand
),
1140 ReceiveBuffer
, &ReceiveBufferSize
1143 // PF PhysicalPresence = TRUE
1145 TpmPhysicalPresenceCommand
[11] = 0x08;
1146 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1147 Status
= TpmMpDriver
->Transmit (
1148 TpmMpDriver
, TpmPhysicalPresenceCommand
,
1149 sizeof (TpmPhysicalPresenceCommand
),
1156 // TPM_PhysicalEnable
1158 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1159 Status
= TpmMpDriver
->Transmit (
1160 TpmMpDriver
, TpmPhysicalEnableCommand
,
1161 sizeof (TpmPhysicalEnableCommand
),
1162 ReceiveBuffer
, &ReceiveBufferSize
1168 // TPM_PhysicalDisable
1170 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1171 Status
= TpmMpDriver
->Transmit (
1172 TpmMpDriver
, TpmPhysicalDisableCommand
,
1173 sizeof (TpmPhysicalDisableCommand
),
1181 // TPM_PhysicalSetDeactivated=FALSE
1183 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1184 TpmPhysicalSetDeactivatedCommand
[10] = 0x00;
1185 Status
= TpmMpDriver
->Transmit (
1187 TpmPhysicalSetDeactivatedCommand
,
1188 sizeof (TpmPhysicalSetDeactivatedCommand
),
1189 ReceiveBuffer
, &ReceiveBufferSize
1191 gRT
->ResetSystem (EfiResetWarm
, EFI_SUCCESS
, 0, NULL
);
1196 // TPM_PhysicalSetDeactivated=TRUE
1198 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1199 TpmPhysicalSetDeactivatedCommand
[10] = 0x01;
1200 Status
= TpmMpDriver
->Transmit (
1202 TpmPhysicalSetDeactivatedCommand
,
1203 sizeof (TpmPhysicalSetDeactivatedCommand
),
1219 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1220 Status
= TpmMpDriver
->Transmit (
1222 TpmForceClearCommand
,
1223 sizeof (TpmForceClearCommand
),
1237 // TPM_PhysicalEnable
1239 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1240 Status
= TpmMpDriver
->Transmit (
1242 TpmPhysicalEnableCommand
,
1243 sizeof (TpmPhysicalEnableCommand
),
1248 // TPM_PhysicalSetDeactivated=FALSE
1250 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1251 TpmPhysicalSetDeactivatedCommand
[10] = 0x00;
1252 Status
= TpmMpDriver
->Transmit (
1254 TpmPhysicalSetDeactivatedCommand
,
1255 sizeof (TpmPhysicalSetDeactivatedCommand
),
1269 // TPM_PhysicalSetDeactivated=TRUE
1271 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1272 TpmPhysicalSetDeactivatedCommand
[10] = 0x01;
1273 Status
= TpmMpDriver
->Transmit (
1275 TpmPhysicalSetDeactivatedCommand
,
1276 sizeof (TpmPhysicalSetDeactivatedCommand
),
1281 // TPM_PhysicalDisable
1283 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1284 Status
= TpmMpDriver
->Transmit (
1286 TpmPhysicalDisableCommand
,
1287 sizeof (TpmPhysicalDisableCommand
),
1301 // TPM_SetOwnerInstall=TRUE
1303 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1304 TpmSetOwnerInstallCommand
[10] = 0x01;
1305 Status
= TpmMpDriver
->Transmit (
1307 TpmSetOwnerInstallCommand
,
1308 sizeof (TpmSetOwnerInstallCommand
),
1316 // TPM_SetOwnerInstall=FALSE
1318 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1319 TpmSetOwnerInstallCommand
[10] = 0x00;
1320 Status
= TpmMpDriver
->Transmit (
1322 TpmSetOwnerInstallCommand
,
1323 sizeof (TpmSetOwnerInstallCommand
),
1331 // TPM_PhysicalEnable
1333 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1334 Status
= TpmMpDriver
->Transmit (
1336 TpmPhysicalEnableCommand
,
1337 sizeof (TpmPhysicalEnableCommand
),
1342 // TPM_PhysicalSetDeactivated=FALSE
1344 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1345 TpmPhysicalSetDeactivatedCommand
[10] = 0x00;
1346 Status
= TpmMpDriver
->Transmit (
1348 TpmPhysicalSetDeactivatedCommand
,
1349 sizeof (TpmPhysicalSetDeactivatedCommand
),
1354 // Do TPM_SetOwnerInstall=TRUE on next reboot
1357 WriteCmosBank1Byte (CpuIo
, ACPI_TPM_REQUEST
, 0xF0);
1369 // TPM_SetOwnerInstall=FALSE
1371 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1372 TpmSetOwnerInstallCommand
[10] = 0x00;
1373 Status
= TpmMpDriver
->Transmit (
1375 TpmSetOwnerInstallCommand
,
1376 sizeof (TpmSetOwnerInstallCommand
),
1381 // TPM_PhysicalSetDeactivated=TRUE
1383 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1384 TpmPhysicalSetDeactivatedCommand
[10] = 0x01;
1385 Status
= TpmMpDriver
->Transmit (
1387 TpmPhysicalSetDeactivatedCommand
,
1388 sizeof (TpmPhysicalSetDeactivatedCommand
),
1393 // TPM_PhysicalDisable
1395 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1396 Status
= TpmMpDriver
->Transmit (
1398 TpmPhysicalDisableCommand
,
1399 sizeof (TpmPhysicalDisableCommand
),
1415 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1416 Status
= TpmMpDriver
->Transmit (
1418 TpmForceClearCommand
,
1419 sizeof (TpmForceClearCommand
),
1424 // TPM_PhysicalEnable
1426 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1427 Status
= TpmMpDriver
->Transmit (
1429 TpmPhysicalEnableCommand
,
1430 sizeof (TpmPhysicalEnableCommand
),
1435 // TPM_PhysicalSetDeactivated=FALSE
1437 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1438 TpmPhysicalSetDeactivatedCommand
[10] = 0x00;
1439 Status
= TpmMpDriver
->Transmit (
1441 TpmPhysicalSetDeactivatedCommand
,
1442 sizeof (TpmPhysicalSetDeactivatedCommand
),
1456 // Second part of ACPI TPM request 0x0A: OEM custom TPM_SetOwnerInstall=TRUE
1458 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1459 TpmSetOwnerInstallCommand
[10] = 0x01;
1460 Status
= TpmMpDriver
->Transmit (
1462 TpmSetOwnerInstallCommand
,
1463 sizeof (TpmSetOwnerInstallCommand
),
1467 WriteCmosBank1Byte (CpuIo
, ACPI_TPM_LAST_REQUEST
, 0x0A);
1470 // Deassert Physical Presence
1472 TpmPhysicalPresenceCommand
[11] = 0x10;
1473 ReceiveBufferSize
= sizeof(ReceiveBuffer
);
1474 Status
= TpmMpDriver
->Transmit (
1476 TpmPhysicalPresenceCommand
,
1477 sizeof (TpmPhysicalPresenceCommand
),
1489 Initializes manufacturing and config mode setting.
1493 InitMfgAndConfigModeStateVar()
1495 EFI_PLATFORM_SETUP_ID
*BootModeBuffer
;
1499 HobList
= GetFirstGuidHob(&gEfiPlatformBootModeGuid
);
1500 if (HobList
!= NULL
) {
1501 BootModeBuffer
= GET_GUID_HOB_DATA (HobList
);
1504 // Check if in Manufacturing mode
1507 &BootModeBuffer
->SetupName
,
1508 MANUFACTURE_SETUP_NAME
,
1509 StrSize (MANUFACTURE_SETUP_NAME
)
1522 Initializes manufacturing and config mode setting.
1526 InitPlatformBootMode()
1528 EFI_PLATFORM_SETUP_ID
*BootModeBuffer
;
1531 HobList
= GetFirstGuidHob(&gEfiPlatformBootModeGuid
);
1532 if (HobList
!= NULL
) {
1533 BootModeBuffer
= GET_GUID_HOB_DATA (HobList
);
1534 mPlatformBootMode
= BootModeBuffer
->PlatformBootMode
;
1548 UINT16 ItkModBiosState
;
1554 // Setup local variable according to ITK variable
1557 // Read ItkBiosModVar to determine if BIOS has been modified by ITK
1558 // If ItkBiosModVar = 0 or if variable hasn't been initialized then BIOS has not been modified by ITK modified
1559 // Set local variable VAR_EQ_ITK_BIOS_MOD_DECIMAL_NAME=0 if BIOS has not been modified by ITK
1561 DataSize
= sizeof (Value
);
1562 Status
= gRT
->GetVariable (
1563 ITK_BIOS_MOD_VAR_NAME
,
1569 if (Status
== EFI_NOT_FOUND
) {
1571 // Variable not found, hasn't been initialized, intialize to 0
1575 // Write variable to flash.
1578 ITK_BIOS_MOD_VAR_NAME
,
1580 EFI_VARIABLE_RUNTIME_ACCESS
|
1581 EFI_VARIABLE_NON_VOLATILE
|
1582 EFI_VARIABLE_BOOTSERVICE_ACCESS
,
1588 if ( (!EFI_ERROR (Status
)) || (Status
== EFI_NOT_FOUND
) ) {
1589 if (Value
== 0x00) {
1590 ItkModBiosState
= 0x00;
1592 ItkModBiosState
= 0x01;
1595 VAR_EQ_ITK_BIOS_MOD_DECIMAL_NAME
,
1596 &gEfiNormalSetupGuid
,
1597 EFI_VARIABLE_BOOTSERVICE_ACCESS
,
1599 (void *)&ItkModBiosState
1604 #if defined(FIRMWARE_ID_BACKWARD_COMPATIBLE) && (FIRMWARE_ID_BACKWARD_COMPATIBLE != 0)
1608 Initializes the BIOS FIRMWARE ID from the FIRMWARE_ID build variable.
1617 CHAR16 FirmwareIdNameWithPassword
[] = FIRMWARE_ID_NAME_WITH_PASSWORD
;
1620 // First try writing the variable without a password in case we are
1621 // upgrading from a BIOS without password protection on the FirmwareId
1623 Status
= gRT
->SetVariable(
1624 (CHAR16
*)&gFirmwareIdName
,
1626 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
|
1627 EFI_VARIABLE_RUNTIME_ACCESS
,
1628 sizeof( FIRMWARE_ID
) - 1,
1632 if (Status
== EFI_INVALID_PARAMETER
) {
1635 // Since setting the firmware id without the password failed,
1636 // a password must be required.
1638 Status
= gRT
->SetVariable(
1639 (CHAR16
*)&FirmwareIdNameWithPassword
,
1641 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
|
1642 EFI_VARIABLE_RUNTIME_ACCESS
,
1643 sizeof( FIRMWARE_ID
) - 1,
1655 // Workaround to support IIA bug.
1656 // IIA request to change option value to 4, 5 and 7 relatively
1657 // instead of 1, 2, and 3 which follow Lakeport Specs.
1658 // Check option value, temporary hardcode GraphicsDriverMemorySize
1659 // Option value to fulfill IIA requirment. So that user no need to
1660 // load default and update setupvariable after update BIOS.
1661 // Option value hardcoded as: 1 to 4, 2 to 5, 3 to 7.
1662 // *This is for broadwater and above product only.
1665 SYSTEM_CONFIGURATION SystemConfiguration
;
1669 VarSize
= sizeof(SYSTEM_CONFIGURATION
);
1670 Status
= gRT
->GetVariable(
1672 &gEfiNormalSetupGuid
,
1675 &SystemConfiguration
1678 if (EFI_ERROR (Status
) || VarSize
!= sizeof(SYSTEM_CONFIGURATION
)) {
1679 //The setup variable is corrupted
1680 VarSize
= sizeof(SYSTEM_CONFIGURATION
);
1681 Status
= gRT
->GetVariable(
1683 &gEfiNormalSetupGuid
,
1686 &SystemConfiguration
1688 ASSERT_EFI_ERROR (Status
);
1691 if((SystemConfiguration
.GraphicsDriverMemorySize
< 4) && !EFI_ERROR(Status
) ) {
1692 switch (SystemConfiguration
.GraphicsDriverMemorySize
){
1694 SystemConfiguration
.GraphicsDriverMemorySize
= 4;
1697 SystemConfiguration
.GraphicsDriverMemorySize
= 5;
1700 SystemConfiguration
.GraphicsDriverMemorySize
= 7;
1706 Status
= gRT
->SetVariable (
1708 &gEfiNormalSetupGuid
,
1709 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
1710 sizeof(SYSTEM_CONFIGURATION
),
1711 &SystemConfiguration
1717 InitPlatformUsbPolicy (
1727 mUsbPolicyData
.Version
= (UINT8
)USB_POLICY_PROTOCOL_REVISION_2
;
1728 mUsbPolicyData
.UsbMassStorageEmulationType
= mSystemConfiguration
.UsbBIOSINT13DeviceEmulation
;
1729 if(mUsbPolicyData
.UsbMassStorageEmulationType
== 3) {
1730 mUsbPolicyData
.UsbEmulationSize
= mSystemConfiguration
.UsbBIOSINT13DeviceEmulationSize
;
1732 mUsbPolicyData
.UsbEmulationSize
= 0;
1734 mUsbPolicyData
.UsbZipEmulationType
= mSystemConfiguration
.UsbZipEmulation
;
1735 mUsbPolicyData
.UsbOperationMode
= HIGH_SPEED
;
1738 // Some chipset need Period smi, 0 = LEGACY_PERIOD_UN_SUPP
1740 mUsbPolicyData
.USBPeriodSupport
= LEGACY_PERIOD_UN_SUPP
;
1743 // Some platform need legacyfree, 0 = LEGACY_FREE_UN_SUPP
1745 mUsbPolicyData
.LegacyFreeSupport
= LEGACY_FREE_UN_SUPP
;
1748 // Set Code base , TIANO_CODE_BASE =0x01, ICBD =0x00
1750 mUsbPolicyData
.CodeBase
= (UINT8
)ICBD_CODE_BASE
;
1753 // Some chispet 's LpcAcpibase are diffrent,set by platform or chipset,
1754 // default is Ich acpibase =0x040. acpitimerreg=0x08.
1755 mUsbPolicyData
.LpcAcpiBase
= 0x40;
1756 mUsbPolicyData
.AcpiTimerReg
= 0x08;
1759 // Set for reduce usb post time
1761 mUsbPolicyData
.UsbTimeTue
= 0x00;
1762 mUsbPolicyData
.InternelHubExist
= 0x00; //TigerPoint doesn't have RMH
1763 mUsbPolicyData
.EnumWaitPortStableStall
= 100;
1766 Status
= gBS
->InstallProtocolInterface (
1769 EFI_NATIVE_INTERFACE
,
1772 ASSERT_EFI_ERROR(Status
);
1778 IN EFI_CPU_IO_PROTOCOL
*CpuIo
,
1784 CpuIo
->Io
.Write (CpuIo
, EfiCpuIoWidthUint8
, 0x72, 1, &Index
);
1785 CpuIo
->Io
.Read (CpuIo
, EfiCpuIoWidthUint8
, 0x73, 1, &Data
);
1790 WriteCmosBank1Byte (
1791 IN EFI_CPU_IO_PROTOCOL
*CpuIo
,