1 /*++ 2 3 Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR> 4 5 This program and the accompanying materials are licensed and made available under 6 the terms and conditions of the BSD License that accompanies this distribution. 7 The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php. 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 14 15 Module Name: 16 17 PlatformDxe.h 18 19 Abstract: 20 21 Header file for Platform Initialization Driver. 22 23 24 25 ++*/ 26 27 #ifndef _PLATFORM_DRIVER_H 28 #define _PLATFORM_DRIVER_H 29 30 #include <PiDxe.h> 31 #include <Library/BaseLib.h> 32 #include <Library/DebugLib.h> 33 #include <Library/UefiLib.h> 34 #include <Library/UefiDriverEntryPoint.h> 35 #include <Library/PcdLib.h> 36 #include <Library/HobLib.h> 37 #include <Library/MemoryAllocationLib.h> 38 #include <Library/UefiBootServicesTableLib.h> 39 #include <Library/BaseMemoryLib.h> 40 #include <Library/UefiRuntimeServicesTableLib.h> 41 #include <Library/IoLib.h> 42 #include <Library/ReportStatusCodeLib.h> 43 #include <Library/HobLib.h> 44 #include <Library/EfiRegTableLib.h> 45 #include <Library/Tpm2CommandLib.h> 46 #include <Library/Tpm2DeviceLib.h> 47 #include <Library/BaseCryptLib.h> 48 #include <Library/BiosIdLib.h> 49 #include <Protocol/GlobalNvsArea.h> 50 #include <Protocol/PciRootBridgeIo.h> 51 #include <Protocol/IsaAcpi.h> 52 #include <Framework/FrameworkInternalFormRepresentation.h> 53 #include <Protocol/FrameworkHii.h> 54 #include <Protocol/FrameworkFormCallback.h> 55 #include <Protocol/CpuIo.h> 56 #include <Protocol/BootScriptSave.h> 57 #include <Framework/BootScript.h> 58 #include <Guid/GlobalVariable.h> 59 #include <Guid/BoardFeatures.h> 60 #include <Guid/DataHubRecords.h> 61 #include <Protocol/DataHub.h> 62 #include <Protocol/PciIo.h> 63 #include <Protocol/Speaker.h> 64 #include <Protocol/ExitPmAuth.h> 65 #include <IndustryStandard/Pci22.h> 66 #include <Guid/SetupVariable.h> 67 #include <Guid/PlatformInfo.h> 68 #include "Configuration.h" 69 #define _EFI_H_ //skip efi.h 70 #include "PchAccess.h" 71 #include "VlvAccess.h" 72 #include "BoardIdDecode.h" 73 #include "PlatformBaseAddresses.h" 74 #include "SetupMode.h" 75 #include "PlatformBootMode.h" 76 #include "CpuType.h" 77 78 #define PCAT_RTC_ADDRESS_REGISTER 0x74 79 #define PCAT_RTC_DATA_REGISTER 0x75 80 81 #define RTC_ADDRESS_SECOND_ALARM 0x01 82 #define RTC_ADDRESS_MINUTE_ALARM 0x03 83 #define RTC_ADDRESS_HOUR_ALARM 0x05 84 85 #define RTC_ADDRESS_REGISTER_A 0x0A 86 #define RTC_ADDRESS_REGISTER_B 0x0B 87 #define RTC_ADDRESS_REGISTER_C 0x0C 88 #define RTC_ADDRESS_REGISTER_D 0x0D 89 90 #define B_RTC_ALARM_INT_ENABLE 0x20 91 #define B_RTC_ALARM_INT_STATUS 0x20 92 93 #define B_RTC_DATE_ALARM_MASK 0x3F 94 95 // 96 // Default CPU Alternate Duty Cycle (255=100%, 0=0%) 97 // 98 #define DEF_CPU_ALT_DUTY_CYCLE 0xFF 99 100 #define MAX_ONBOARD_SATA_DEVICE 2 101 102 #define DXE_DEVICE_ENABLED 1 103 #define DXE_DEVICE_DISABLED 0 104 105 #define AZALIA_MAX_LOOP_TIME 0x10000 106 107 // 108 // Platform driver GUID 109 // 110 #define EFI_PLATFORM_DRIVER_GUID \ 111 { 0x056E7324, 0xA718, 0x465b, 0x9A, 0x84, 0x22, 0x8F, 0x06, 0x64, 0x2B, 0x4F } 112 113 #define PASSWORD_MAX_SIZE 20 114 #define PLATFORM_NORMAL_MODE 0x01 115 #define PLATFORM_SAFE_MODE 0x02 116 #define PLATFORM_RECOVERY_MODE 0x04 117 #define PLATFORM_MANUFACTURING_MODE 0x08 118 #define PLATFORM_BACK_TO_BIOS_MODE 0x10 119 120 #define EFI_OEM_SPECIFIC 0x8000 121 #define EFI_CU_PLATFORM_DXE_INIT (EFI_OEM_SPECIFIC | 0x00000011) 122 #define EFI_CU_PLATFORM_DXE_STEP1 (EFI_OEM_SPECIFIC | 0x00000012) 123 #define EFI_CU_PLATFORM_DXE_STEP2 (EFI_OEM_SPECIFIC | 0x00000013) 124 #define EFI_CU_PLATFORM_DXE_STEP3 (EFI_OEM_SPECIFIC | 0x00000014) 125 #define EFI_CU_PLATFORM_DXE_STEP4 (EFI_OEM_SPECIFIC | 0x00000015) 126 #define EFI_CU_PLATFORM_DXE_INIT_DONE (EFI_OEM_SPECIFIC | 0x00000016) 127 128 129 #define EFI_SECTION_STRING 0x1C 130 #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x 131 #define PREFIX_BLANK 0x04 132 133 #pragma pack(1) 134 135 typedef UINT64 EFI_BOARD_FEATURES; 136 137 // 138 //BUGBUG: should remove these EDK hii definition once Hii transtion is done 139 // 140 typedef UINT16 STRING_REF; 141 typedef UINT16 EFI_FORM_LABEL; 142 143 typedef enum { 144 EfiUserPassword, 145 EfiAdminPassword 146 } EFI_PASSWORD_TYPE; 147 148 typedef struct { 149 CHAR16 TempPassword[PASSWORD_MAX_SIZE]; 150 CHAR16 EncodedPassword[PASSWORD_MAX_SIZE]; 151 VOID *PasswordLocation; 152 EFI_PASSWORD_TYPE PasswordType; 153 } EFI_PASSWORD_DATA; 154 155 typedef struct { 156 CHAR8 AaNumber[7]; 157 UINT8 BoardId; 158 EFI_BOARD_FEATURES Features; 159 UINT16 SubsystemDeviceId; 160 UINT16 AudioSubsystemDeviceId; 161 UINT64 AcpiOemTableId; 162 } BOARD_ID_DECODE; 163 164 typedef 165 EFI_STATUS 166 (EFIAPI *EFI_FORM_ROUTINE) ( 167 SYSTEM_CONFIGURATION *SetupBuffer 168 ); 169 170 typedef struct{ 171 UINT16 DeviceNumber; 172 UINT16 FunctionNumber; 173 }PCI_DEVICE_FUNC_INFO; 174 175 typedef struct{ 176 CHAR16 PortNumber[4]; 177 STRING_REF SataDeviceInfoStringId; 178 }SATA_DEVICE_STRING_INFO; 179 180 typedef struct { 181 UINT16 Signature; 182 UINT8 Size; 183 UINT32 EntryPoint; 184 UINT8 Reserve[17]; 185 UINT16 PciDataOff; 186 UINT16 ExpansionOff; 187 } PNP_OPTION_ROM_HEADER; 188 189 typedef struct { 190 UINT32 Signature; 191 UINT8 Revision; 192 UINT8 Length; 193 UINT16 NextHeader; 194 UINT8 Reserve; 195 UINT8 CheckSum; 196 UINT32 DeviceId; 197 UINT16 ManufactureStrOff; 198 UINT16 ProductStrOff; 199 } PNP_EXPANSION_HEADER; 200 201 typedef struct { 202 BOOLEAN Enable; 203 UINT8 VerbTableNum; 204 UINT16 CodecSSID; 205 EFI_PHYSICAL_ADDRESS HDABar; 206 EFI_PHYSICAL_ADDRESS UpperHDABar; 207 UINT8 SDIPresent; 208 BOOLEAN Pme; 209 BOOLEAN LegacyFrontPanelAudio; 210 BOOLEAN HighDefinitionFrontPanelAudio; 211 } EFI_AZALIA_S3; 212 213 // 214 //following structs are from R8. Remove them once R8->R9 transition is done 215 // 216 typedef struct { 217 CHAR16 *OptionString; // Passed in string to generate a token for in a truly dynamic form creation 218 STRING_REF StringToken; // This is used when creating a single op-code without generating a StringToken (have one already) 219 UINT16 Value; 220 UINT8 Flags; 221 UINT16 Key; 222 } IFR_OPTION; 223 224 225 226 typedef struct { 227 UINT8 Number; 228 UINT32 HorizontalResolution; 229 UINT32 VerticalResolution; 230 } PANEL_RESOLUTION; 231 232 #pragma pack() 233 234 // 235 // Prototypes 236 // 237 EFI_STATUS 238 EFIAPI 239 EfiMain ( 240 IN EFI_HANDLE ImageHandle, 241 IN EFI_SYSTEM_TABLE *SystemTable 242 ); 243 244 EFI_STATUS 245 ProcessEventLog ( 246 ); 247 248 EFI_STATUS 249 FindDataRecords ( 250 ); 251 252 EFI_STATUS 253 ProcessPasswords( 254 ); 255 256 VOID 257 MemorySetup( 258 ); 259 260 261 UINTN 262 EfiValueToString ( 263 IN OUT CHAR16 *Buffer, 264 IN INT64 Value, 265 IN UINTN Flags, 266 IN UINTN Width 267 ); 268 269 VOID 270 EFIAPI 271 ReadyToBootFunction ( 272 EFI_EVENT Event, 273 VOID *Context 274 ); 275 276 VOID 277 InstallHiiDataAndGetSettings( 278 IN EFI_HII_STRING_PACK *StringPack, 279 // 280 ... // 0 or more of => IN EFI_HII_IFR_PACK *IfrPack, 281 // Terminate list with NULL 282 // 283 ); 284 285 EFI_STATUS 286 ReadOrInitSetupVariable( 287 IN UINTN RequiredVariableSize, 288 IN UINTN RequiredPasswordSize, 289 IN VOID *DefaultData, 290 IN VOID *MfgDefaultData, 291 OUT VOID *SetupVariableData, 292 OUT VOID *SystemPassword 293 ); 294 295 VOID 296 EfiLogicalOrMem( 297 IN VOID *Destination, 298 IN VOID *Source, 299 IN UINTN Length 300 ); 301 302 EFI_STATUS 303 GetStringFromToken ( 304 IN EFI_GUID *ProducerGuid, 305 IN STRING_REF Token, 306 OUT CHAR16 **String 307 ); 308 309 UINT32 310 ConvertBase2ToRaw ( 311 IN EFI_EXP_BASE2_DATA *Data); 312 313 UINT32 314 ConvertBase10ToRaw ( 315 IN EFI_EXP_BASE10_DATA *Data); 316 317 CHAR16 * 318 GetStringById ( 319 IN STRING_REF Id, 320 EFI_HII_HANDLE StringPackHandle 321 ); 322 323 VOID 324 EFIAPI 325 SetupDataFilter ( 326 IN EFI_EVENT Event, 327 IN VOID* Context 328 ); 329 330 VOID 331 EFIAPI 332 IdeDataFilter ( 333 IN EFI_EVENT Event, 334 IN VOID* Context 335 ); 336 337 VOID 338 EFIAPI 339 UpdateAhciRaidDiskInfo ( 340 IN EFI_EVENT Event, 341 IN VOID* Context 342 ); 343 344 VOID 345 EFIAPI 346 EventLogFilter ( 347 IN EFI_EVENT Event, 348 IN VOID* Context 349 ); 350 351 VOID 352 SwapEntries ( 353 IN CHAR8 *Data 354 ); 355 356 VOID 357 AsciiToUnicode ( 358 IN CHAR8 *AsciiString, 359 IN CHAR16 *UnicodeString 360 ); 361 362 UINT16 363 ConfigModeStateGet(); 364 365 VOID 366 SetSkus(); 367 368 VOID 369 CPUSetupItems(); 370 371 EFI_STATUS 372 SecurityDriverCallback ( 373 IN EFI_FORM_CALLBACK_PROTOCOL *This, 374 IN UINT16 KeyValue, 375 IN EFI_IFR_DATA_ARRAY *Data, 376 OUT EFI_HII_CALLBACK_PACKET **Packet 377 ); 378 379 VOID 380 SetPasswordState ( 381 ); 382 383 VOID 384 EncodePassword ( 385 IN CHAR16 *Password 386 ); 387 388 VOID 389 EFIAPI 390 PciBusEvent ( 391 IN EFI_EVENT Event, 392 IN VOID* Context 393 ); 394 VOID 395 AsfInitialize( 396 ); 397 398 VOID 399 InitializeAsf ( 400 ); 401 402 UINT8 403 ReadCmosBank1Byte ( 404 IN EFI_CPU_IO_PROTOCOL *CpuIo, 405 IN UINT8 Index 406 ); 407 408 VOID 409 WriteCmosBank1Byte ( 410 IN EFI_CPU_IO_PROTOCOL *CpuIo, 411 IN UINT8 Index, 412 IN UINT8 Data 413 ); 414 415 VOID 416 InitializeBoardId ( 417 ); 418 419 EFI_STATUS 420 InstallBootCallbackRoutine( 421 ); 422 423 EFI_STATUS 424 InstallConfigurationCallbackRoutine( 425 ); 426 427 EFI_STATUS 428 InstallPerformanceCallbackRoutine( 429 ); 430 431 EFI_STATUS 432 InstallSecurityCallbackRoutine ( 433 ); 434 435 EFI_STATUS 436 InstallMainCallbackRoutine ( 437 ); 438 439 EFI_STATUS 440 MemoryConfigurationUpdate ( 441 UINT16 *Key, 442 EFI_FORM_LABEL *Label, 443 UINT16 *OpcodeCount, 444 UINT8 **OpcodeData, 445 EFI_FORM_ROUTINE *Routine 446 ); 447 448 EFI_STATUS 449 MemoryConfigurationCallbackRoutine ( 450 SYSTEM_CONFIGURATION *SetupBuffer 451 ); 452 453 EFI_STATUS 454 MemoryConfigurationCalculateSpeed( 455 SYSTEM_CONFIGURATION *SetupBuffer 456 ); 457 458 VOID 459 UpdateMemoryString( 460 IN STRING_REF TokenToUpdate, 461 IN CHAR16 *NewString 462 ); 463 464 VOID 465 InitFeaturePolicy ( 466 IN EFI_PLATFORM_INFO_HOB *PlatformInfo 467 ); 468 469 VOID 470 InitializeSetupVarHide ( 471 ); 472 473 VOID 474 PreparePCIePCISlotInformation( 475 VOID 476 ); 477 478 479 EFI_STATUS 480 BootConfigurationUpdate ( 481 IN OUT SYSTEM_CONFIGURATION *SystemConfiguration 482 ); 483 484 EFI_STATUS 485 InitializeBootConfiguration( 486 VOID 487 ); 488 489 UINT16 490 GetStringSize( 491 IN CHAR16 *ThisString 492 ); 493 494 UINT16 495 GetDriveCount ( 496 IN STRING_REF *BootMap 497 ); 498 499 CHAR16 * 500 GetBootString ( 501 IN STRING_REF Id, 502 OUT UINTN *Length 503 ); 504 505 EFI_STATUS 506 BootCfgCreateTwoOptionOneOf( 507 IN UINT16 QuestionId, 508 IN EFI_FORM_LABEL Label, 509 IN STRING_REF OptionPrompt, 510 IN STRING_REF OptionHelp, 511 IN STRING_REF OptionOneString, 512 IN STRING_REF OptionTwoString, 513 IN UINT8 OptionOneFlags, 514 IN UINT8 OptionTwoFlags, 515 IN UINT16 KeyValueOne, 516 IN UINT16 KeyValueTwo 517 ); 518 519 EFI_STATUS 520 ReplaceOpcodeWithText( 521 IN STRING_REF OptionPrompt, 522 IN STRING_REF OptionHelp, 523 IN STRING_REF OptionOneString, 524 IN EFI_FORM_LABEL Label 525 ); 526 527 EFI_STATUS 528 CreateDriveBootOrderOpcode( 529 IN VOID *Data, 530 IN STRING_REF *BootMap, 531 IN EFI_FORM_LABEL Label, 532 IN UINT16 QuestionId, 533 IN STRING_REF OptionOneString, 534 IN STRING_REF OptionTwoString 535 ); 536 537 VOID 538 SetHyperBootCfgFlags( 539 IN OUT SYSTEM_CONFIGURATION *SystemConfiguration 540 ); 541 542 VOID 543 GetHyperBootCfgFlags( 544 IN OUT SYSTEM_CONFIGURATION *SystemConfiguration 545 ); 546 547 VOID 548 PrepareBootCfgForHyperBoot( 549 IN OUT SYSTEM_CONFIGURATION *SystemConfiguration 550 ); 551 552 BOOLEAN 553 BootCfgChanged( 554 IN SYSTEM_CONFIGURATION *SystemConfiguration 555 ); 556 557 EFI_STATUS 558 InsertOpcodeAtIndex( 559 IN SYSTEM_CONFIGURATION *SystemConfiguration, 560 IN OUT IFR_OPTION *OptionList, 561 IN IFR_OPTION IfrOption, 562 IN UINT16 OptionCount 563 ); 564 565 VOID 566 ConfigureBootOrderStrings( 567 IN SYSTEM_CONFIGURATION *SystemConfiguration 568 ); 569 570 VOID 571 InitializeAllBootStrings( 572 VOID 573 ); 574 575 VOID 576 SaveUsbCfgSettings( 577 IN OUT SYSTEM_CONFIGURATION *SystemConfiguration 578 ); 579 580 VOID 581 RestoreUsbCfgSettings( 582 IN OUT SYSTEM_CONFIGURATION *SystemConfiguration 583 ); 584 585 EFI_STATUS 586 UpdateBootDevicePriority( 587 IN OUT SYSTEM_CONFIGURATION *SystemConfiguration 588 ); 589 590 EFI_STATUS 591 DisableHyperBoot( 592 IN OUT SYSTEM_CONFIGURATION *SystemConfiguration 593 ); 594 595 BOOLEAN 596 CheckForUserPassword( 597 VOID 598 ); 599 600 EFI_STATUS 601 EFIAPI 602 HyperBootPasswordCallback( 603 IN OUT VOID* Data 604 ); 605 606 EFI_STATUS 607 EFIAPI 608 HyperBootF9Callback ( 609 IN VOID* Data 610 ); 611 612 EFI_STATUS 613 InstallHiiEvents( 614 VOID 615 ); 616 617 EFI_STATUS 618 EFIAPI 619 ProgramToneFrequency ( 620 IN EFI_SPEAKER_IF_PROTOCOL *This, 621 IN UINT16 Frequency 622 ); 623 624 EFI_STATUS 625 EFIAPI 626 GenerateBeepTone ( 627 IN EFI_SPEAKER_IF_PROTOCOL *This, 628 IN UINTN NumberOfBeeps, 629 IN UINTN BeepDuration, 630 IN UINTN TimeInterval 631 ); 632 633 EFI_STATUS 634 InitializeObservableProtocol(); 635 636 EFI_STATUS 637 PciBusDriverHook(); 638 639 VOID 640 EFIAPI 641 AdjustDefaultRtcTimeCallback ( 642 IN EFI_EVENT Event, 643 IN VOID *Context 644 ); 645 646 typedef struct _GOP_DISPLAY_BRIGHTNESS_PROTOCOL GOP_DISPLAY_BRIGHTNESS_PROTOCOL; 647 648 typedef 649 EFI_STATUS 650 (EFIAPI *GET_MAXIMUM_BRIGHTNESS_LEVEL) ( 651 IN GOP_DISPLAY_BRIGHTNESS_PROTOCOL *This, 652 OUT UINT32 *MaxBrightnessLevel 653 ); 654 655 656 typedef 657 EFI_STATUS 658 (EFIAPI *GET_CURRENT_BRIGHTNESS_LEVEL) ( 659 IN GOP_DISPLAY_BRIGHTNESS_PROTOCOL *This, 660 OUT UINT32 *MaxBrightnessLevel 661 ); 662 663 typedef 664 EFI_STATUS 665 (EFIAPI *SET_BRIGHTNESS_LEVEL) ( 666 IN GOP_DISPLAY_BRIGHTNESS_PROTOCOL *This, 667 IN UINT32 BrightnessLevel 668 ); 669 670 struct _GOP_DISPLAY_BRIGHTNESS_PROTOCOL { 671 UINT32 Revision; 672 GET_MAXIMUM_BRIGHTNESS_LEVEL GetMaxBrightnessLevel; 673 GET_CURRENT_BRIGHTNESS_LEVEL GetCurrentBrightnessLevel; 674 SET_BRIGHTNESS_LEVEL SetBrightnessLevel; 675 }; 676 677 // 678 // Global externs 679 // 680 extern UINT8 MaintenanceBin[]; 681 extern UINT8 MainBin[]; 682 extern UINT8 ConfigurationBin[]; 683 extern UINT8 MemoryConfigurationBin[]; 684 extern UINT8 PerformanceBin[]; 685 extern UINT8 SecurityBin[]; 686 extern UINT8 BootBin[]; 687 extern UINT8 PowerBin[]; 688 extern UINT8 SystemSetupBin[]; 689 690 extern VOID *mDxePlatformStringPack; 691 extern EFI_HII_PROTOCOL *mHii; 692 extern SYSTEM_CONFIGURATION mSystemConfiguration; 693 extern FRAMEWORK_EFI_HII_HANDLE mMaintenanceHiiHandle; 694 extern FRAMEWORK_EFI_HII_HANDLE mMainHiiHandle; 695 extern FRAMEWORK_EFI_HII_HANDLE mConfigurationHiiHandle; 696 extern FRAMEWORK_EFI_HII_HANDLE mPerformanceHiiHandle; 697 extern FRAMEWORK_EFI_HII_HANDLE mPowerHiiHandle; 698 extern FRAMEWORK_EFI_HII_HANDLE mBootHiiHandle; 699 extern FRAMEWORK_EFI_HII_HANDLE mSecurityHiiHandle; 700 701 extern SYSTEM_PASSWORDS mSystemPassword; 702 extern EFI_PASSWORD_DATA mAdminPassword; 703 extern EFI_PASSWORD_DATA mUserPassword; 704 705 extern EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *mPciRootBridgeIo; 706 707 // 708 //extern EFI_REG_TABLE mSubsystemIdRegs[]; 709 // 710 extern UINT32 mSubsystemVidDid; 711 extern UINT32 mSubsystemAudioVidDid; 712 713 extern UINT8 mBoardIdIndex; 714 extern BOOLEAN mFoundAANum; 715 extern EFI_BOARD_FEATURES mBoardFeatures; 716 extern UINT16 mSubsystemDeviceId; 717 extern UINT16 mSubsystemAudioDeviceId; 718 extern BOARD_ID_DECODE mBoardIdDecodeTable[]; 719 extern UINTN mBoardIdDecodeTableSize; 720 721 extern UINT8 mSmbusRsvdAddresses[]; 722 extern UINT8 mNumberSmbusAddress; 723 extern BOOLEAN mMfgMode; 724 extern UINT32 mPlatformBootMode; 725 extern CHAR8 BoardAaNumber[]; 726 727 extern EFI_GUID gEfiGlobalNvsAreaProtocolGuid; 728 #endif 729