Home | History | Annotate | Download | only in PlatformBdsLib
      1 /*++
      2 
      3   Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
      4 
      5   This program and the accompanying materials are licensed and made available under
      7   the terms and conditions of the BSD License that accompanies this distribution.
      9   The full text of the license may be found at
     11   http://opensource.org/licenses/bsd-license.php.
     13 
     15   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     17   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     19 
     21 
     23 
     24 Module Name:
     25 
     26   BdsPlatform.h
     27 
     28 Abstract:
     29 
     30   Head file for BDS Platform specific code
     31 
     32 --*/
     33 
     34 #ifndef _BDS_PLATFORM_H
     35 #define _BDS_PLATFORM_H
     36 
     37 #include <FrameworkDxe.h>
     38 
     39 #include <Protocol/FirmwareVolume2.h>
     40 #include <Protocol/DevicePath.h>
     41 #include <Protocol/SimpleNetwork.h>
     42 #include <Protocol/PciRootBridgeIo.h>
     43 #include <Protocol/LoadFile.h>
     44 #include <Protocol/LegacyBios.h>
     45 #include <Protocol/PciIo.h>
     46 #include <Protocol/SmmAccess2.h>
     47 #include <Protocol/DxeSmmReadyToLock.h>
     48 #include <Protocol/UserManager.h>
     49 #include <Protocol/DeferredImageLoad.h>
     50 #include <Protocol/AcpiS3Save.h>
     51 #include <Protocol/ExitPmAuth.h>
     52 #include <Protocol/MmioDevice.h>
     53 #include <Protocol/I2cBusMcg.h>
     54 #include <Protocol/I2cHostMcg.h>
     55 #include <Guid/CapsuleVendor.h>
     56 #include <Guid/MemoryTypeInformation.h>
     57 #include <Guid/GlobalVariable.h>
     58 
     59 
     60 #include <Library/DebugLib.h>
     61 #include <Library/BaseMemoryLib.h>
     62 #include <Library/UefiBootServicesTableLib.h>
     63 #include <Library/UefiRuntimeServicesTableLib.h>
     64 #include <Library/MemoryAllocationLib.h>
     65 #include <Library/BaseLib.h>
     66 #include <Library/PcdLib.h>
     67 #include <Library/IoLib.h>
     68 #include <Library/GenericBdsLib.h>
     69 #include <Library/PlatformBdsLib.h>
     70 #include <Library/DevicePathLib.h>
     71 #include <Library/UefiLib.h>
     72 #include <Library/HobLib.h>
     73 #include <Library/PrintLib.h>
     74 #include <Library/PerformanceLib.h>
     75 #include <Library/ReportStatusCodeLib.h>
     76 
     77 #include <IndustryStandard/Pci.h>
     78 
     79 extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformRootBridges [];
     80 extern BDS_CONSOLE_CONNECT_ENTRY gPlatformConsole [];
     81 extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformAllPossiblePciVgaConsole [];
     82 extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformConnectSequence [];
     83 extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformDriverOption [];
     84 extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformBootOption [];
     85 extern EFI_DEVICE_PATH_PROTOCOL  *gUserAuthenticationDevice[];
     86 extern BDS_CONSOLE_CONNECT_ENTRY gPlatformSimpleConsole [];
     87 extern EFI_DEVICE_PATH_PROTOCOL  *gPlatformSimpleBootOption [];
     88 
     89 extern BOOLEAN mEnumBootDevice;
     90 
     91 
     92 //
     93 // the short form device path for Usb keyboard
     94 //
     95 #define CLASS_HID           3
     96 #define SUBCLASS_BOOT       1
     97 #define PROTOCOL_KEYBOARD   1
     98 
     99 #define PCI_DEVICE_PATH_NODE(Func, Dev) \
    100   { \
    101     HARDWARE_DEVICE_PATH, \
    102     HW_PCI_DP, \
    103     { \
    104       (UINT8) (sizeof (PCI_DEVICE_PATH)), \
    105       (UINT8) ((sizeof (PCI_DEVICE_PATH)) >> 8) \
    106     }, \
    107     (Func), \
    108     (Dev) \
    109   }
    110 
    111 #define PNPID_DEVICE_PATH_NODE(PnpId) \
    112   { \
    113     { \
    114       ACPI_DEVICE_PATH, \
    115       ACPI_DP, \
    116       { \
    117         (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \
    118         (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \
    119       } \
    120     }, \
    121     EISA_PNP_ID((PnpId)), \
    122     0 \
    123   }
    124 
    125 #define gUart(BaudRate, DataBits, Parity, StopBits) \
    126   { \
    127     { \
    128       MESSAGING_DEVICE_PATH, \
    129       MSG_UART_DP, \
    130       { \
    131         (UINT8) (sizeof (UART_DEVICE_PATH)), \
    132         (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8) \
    133       } \
    134     }, \
    135     0, \
    136     (BaudRate), \
    137     (DataBits), \
    138     (Parity), \
    139     (StopBits) \
    140   }
    141 
    142 #define gPcAnsiTerminal \
    143   { \
    144     { \
    145       MESSAGING_DEVICE_PATH, \
    146       MSG_VENDOR_DP, \
    147       { \
    148         (UINT8) (sizeof (VENDOR_DEVICE_PATH)), \
    149         (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) \
    150       } \
    151     }, \
    152     DEVICE_PATH_MESSAGING_PC_ANSI \
    153   }
    154 
    155 #define gUsbKeyboardMouse \
    156   { \
    157     { \
    158       MESSAGING_DEVICE_PATH, \
    159       MSG_USB_CLASS_DP, \
    160       (UINT8) (sizeof (USB_CLASS_DEVICE_PATH)), \
    161       (UINT8) ((sizeof (USB_CLASS_DEVICE_PATH)) >> 8) \
    162     }, \
    163     0xffff, \
    164     0xffff, \
    165     CLASS_HID, \
    166     SUBCLASS_BOOT, \
    167     PROTOCOL_KEYBOARD \
    168   }
    169 
    170 #define gEndEntire \
    171   { \
    172     END_DEVICE_PATH_TYPE, \
    173     END_ENTIRE_DEVICE_PATH_SUBTYPE, \
    174     { \
    175       END_DEVICE_PATH_LENGTH, \
    176       0 \
    177     } \
    178   }
    179 
    180 #define gPciRootBridge \
    181   PNPID_DEVICE_PATH_NODE(0x0A03)
    182 
    183 #define gPnpPs2Keyboard \
    184   PNPID_DEVICE_PATH_NODE(0x0303)
    185 
    186 #define gPnp16550ComPort \
    187   PNPID_DEVICE_PATH_NODE(0x0501)
    188 
    189 #define gPciePort0Bridge \
    190   PCI_DEVICE_PATH_NODE(0, 0x1C)
    191 
    192 #define gPciePort1Bridge \
    193   PCI_DEVICE_PATH_NODE(1, 0x1C)
    194 
    195 #define gPciePort2Bridge \
    196   PCI_DEVICE_PATH_NODE(2, 0x1C)
    197 
    198 #define gPciePort3Bridge \
    199   PCI_DEVICE_PATH_NODE(3, 0x1C)
    200 
    201 #define gPciIsaBridge \
    202   PCI_DEVICE_PATH_NODE(0, 0x1f)
    203 
    204 //
    205 // Platform Root Bridge
    206 //
    207 typedef struct {
    208   ACPI_HID_DEVICE_PATH      PciRootBridge;
    209   EFI_DEVICE_PATH_PROTOCOL  End;
    210 } PLATFORM_ROOT_BRIDGE_DEVICE_PATH;
    211 
    212 //
    213 // Below is the platform console device path
    214 //
    215 typedef struct {
    216   ACPI_HID_DEVICE_PATH      PciRootBridge;
    217   PCI_DEVICE_PATH           IsaBridge;
    218   ACPI_HID_DEVICE_PATH      Keyboard;
    219   EFI_DEVICE_PATH_PROTOCOL  End;
    220 } PLATFORM_ISA_KEYBOARD_DEVICE_PATH;
    221 
    222 typedef struct {
    223   VENDOR_DEVICE_PATH             VendorDevicePath;
    224   EFI_DEVICE_PATH_PROTOCOL       End;
    225 } HII_VENDOR_DEVICE_PATH;
    226 
    227 typedef struct {
    228   USB_CLASS_DEVICE_PATH           UsbClass;
    229   EFI_DEVICE_PATH_PROTOCOL        End;
    230 } USB_CLASS_FORMAT_DEVICE_PATH;
    231 
    232 typedef struct {
    233   ACPI_HID_DEVICE_PATH      PciRootBridge;
    234   PCI_DEVICE_PATH           OnboardVga;
    235   EFI_DEVICE_PATH_PROTOCOL  End;
    236 } PLATFORM_ONBOARD_VGA_DEVICE_PATH;
    237 
    238 typedef struct {
    239   ACPI_HID_DEVICE_PATH      PciRootBridge;
    240   PCI_DEVICE_PATH           AgpBridge;
    241   PCI_DEVICE_PATH           AgpDevice;
    242   EFI_DEVICE_PATH_PROTOCOL  End;
    243 } PLATFORM_OFFBOARD_VGA_DEVICE_PATH;
    244 
    245 typedef struct {
    246   ACPI_HID_DEVICE_PATH      PciRootBridge;
    247   PCI_DEVICE_PATH           IsaBridge;
    248   ACPI_HID_DEVICE_PATH      IsaSerial;
    249   UART_DEVICE_PATH          Uart;
    250   VENDOR_DEVICE_PATH        TerminalType;
    251   EFI_DEVICE_PATH_PROTOCOL  End;
    252 } PLATFORM_ISA_SERIAL_DEVICE_PATH;
    253 
    254 //
    255 // Below is the boot option device path
    256 //
    257 typedef struct {
    258   BBS_BBS_DEVICE_PATH             LegacyHD;
    259   EFI_DEVICE_PATH_PROTOCOL        End;
    260 } LEGACY_HD_DEVICE_PATH;
    261 
    262 //
    263 // Below is the platform IDE device path
    264 //
    265 typedef struct {
    266   ACPI_HID_DEVICE_PATH      PciRootBridge;
    267   PCI_DEVICE_PATH           IsaBridge;
    268   ATAPI_DEVICE_PATH         Ide;
    269   EFI_DEVICE_PATH_PROTOCOL  End;
    270 } PLATFORM_IDE_DEVICE_PATH;
    271 
    272 //
    273 // Floppy device path definition
    274 //
    275 typedef struct {
    276   ACPI_HID_DEVICE_PATH      PciRootBridge;
    277   PCI_DEVICE_PATH           IsaBridge;
    278   ACPI_HID_DEVICE_PATH      Floppy;
    279   EFI_DEVICE_PATH_PROTOCOL  End;
    280 } PLATFORM_FLOPPY_DEVICE_PATH;
    281 
    282 //
    283 // Below is the platform USB controller device path for
    284 // USB disk as user authentication device.
    285 //
    286 typedef struct {
    287   ACPI_HID_DEVICE_PATH      PciRootBridge;
    288   PCI_DEVICE_PATH           PciDevice;
    289   EFI_DEVICE_PATH_PROTOCOL  End;
    290 } PLATFORM_USB_DEVICE_PATH;
    291 
    292 //
    293 // Below is the platform PCI device path
    294 //
    295 typedef struct {
    296   ACPI_HID_DEVICE_PATH      PciRootBridge;
    297   PCI_DEVICE_PATH           PciDevice;
    298   EFI_DEVICE_PATH_PROTOCOL  End;
    299 } PLATFORM_PCI_DEVICE_PATH;
    300 
    301 typedef enum {
    302   PMIC_Equal         = 0, // =		0
    303   PMIC_Greater_Than,	  // >		1
    304   PMIC_Smaller_Than,	  // <		2
    305   PMIC_Greater_Equal,	  // >=		3
    306   PMIC_Smaller_Equal,	  // <=		4
    307   PMIC_Any				  // don't care 5
    308 } PMIC_Condition_list;
    309 
    310 typedef enum {
    311   PMIC_White_List	= 0,  //White list
    312   PMIC_Black_List	= 1   //Black list
    313 } PMIC_Compliance_mode;
    314 
    315 typedef struct {
    316   UINT8		Cond_Choice;	// PMIC_Condition_list
    317   UINT8		Cond_Number;		// the number
    318 }PMIC_Condition_Item;
    319 
    320 typedef struct {
    321   PMIC_Condition_Item   					PMIC_BoardID;
    322   PMIC_Condition_Item   					PMIC_FabID;
    323   PMIC_Condition_Item   					Soc_Stepping;//define PMIC type, 1:Dialog , 2:Rohm
    324   PMIC_Condition_Item   					PMIC_VendID;
    325   PMIC_Condition_Item   					PMIC_RevID;
    326   PMIC_Compliance_mode 				        mode;        //if 1, blacklist; if 0, white list.
    327 } PMIC_Compliance_Item;
    328 
    329 //
    330 // Platform BDS Functions
    331 //
    332 VOID
    333 PlatformBdsGetDriverOption (
    334   IN LIST_ENTRY                   *BdsDriverLists
    335   );
    336 
    337 VOID
    338 PlatformBdsPredictBootOption (
    339   IN  LIST_ENTRY                     *BdsBootOptionList
    340   );
    341 
    342 EFI_STATUS
    343 PlatformBdsShowProgress (
    344   EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground,
    345   EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground,
    346   CHAR16                        *Title,
    347   EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor,
    348   UINTN                         Progress,
    349   UINTN                         PreviousValue
    350   );
    351 
    352 VOID
    353 PlatformBdsConnectSequence (
    354   VOID
    355   );
    356 
    357 EFI_STATUS
    358 PlatformBdsConnectConsole (
    359   IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
    360   );
    361 
    362 EFI_STATUS
    363 PlatformBdsNoConsoleAction (
    364   VOID
    365   );
    366 
    367 VOID
    368 PlatformBdsEnterFrontPage (
    369   IN UINT16                 TimeoutDefault,
    370   IN BOOLEAN                ConnectAllHappened
    371   );
    372 
    373 VOID
    374 EFIAPI
    375 PlatformBdsUserIdentify (
    376   OUT EFI_USER_PROFILE_HANDLE        *User,
    377   OUT BOOLEAN                        *DeferredImage
    378   );
    379 
    380 VOID
    381 EFIAPI
    382 PlatformBdsConnectAuthDevice (
    383   VOID
    384   );
    385 
    386 VOID
    387 PlatformBdsEnterFrontPageWithHotKey (
    388   IN UINT16                       TimeoutDefault,
    389   IN BOOLEAN                      ConnectAllHappened
    390   );
    391 
    392  EFI_STATUS
    393  ShowProgress (
    394    IN UINT16					   TimeoutDefault
    395    );
    396 
    397  EFI_STATUS
    398  InitializeFrontPage (
    399    IN BOOLEAN						  InitializeHiiData
    400    );
    401 
    402  VOID
    403  UpdateFrontPageStrings (
    404    VOID
    405    );
    406 
    407 
    408  EFI_STATUS
    409  InitBMPackage  (
    410    VOID
    411    );
    412 
    413 
    414  VOID
    415  FreeBMPackage  (
    416    VOID
    417    );
    418 
    419 
    420  EFI_STATUS
    421  CallFrontPage (
    422    VOID
    423    );
    424 
    425 
    426  VOID
    427  CallBootManager (
    428    VOID
    429    );
    430 
    431 VOID
    432 CallDeviceManager (
    433   VOID
    434   );
    435 
    436 VOID
    437 BdsStartBootMaint (
    438   VOID
    439   );
    440 
    441 CHAR16 *
    442 GetStringById (
    443   IN  EFI_STRING_ID   Id
    444   );
    445 
    446 EFI_STATUS
    447 WaitForSingleEvent (
    448   IN EFI_EVENT                  Event,
    449   IN UINT64                     Timeout OPTIONAL
    450   );
    451 
    452 EFI_STATUS
    453 BdsLibDeleteOptionFromHandle (
    454   IN  EFI_HANDLE                 Handle
    455   );
    456 
    457 EFI_STATUS
    458 BdsDeleteAllInvalidEfiBootOption (
    459   VOID
    460   );
    461 
    462 
    463 #define ONE_SECOND  10000000
    464 #define FRONT_PAGE_KEY_CONTINUE        0x1000
    465 #define FRONT_PAGE_KEY_LANGUAGE        0x1234
    466 #define FRONT_PAGE_KEY_BOOT_MANAGER    0x1064
    467 #define FRONT_PAGE_KEY_DEVICE_MANAGER  0x8567
    468 #define FRONT_PAGE_KEY_BOOT_MAINTAIN   0x9876
    469 
    470 #define PORT_A_DVO                     0           // ; DVO A
    471 #define PORT_B_DVO                     1           // ; DVO B
    472 #define PORT_C_DVO                     2           // ; DVO C
    473 #define PORT_D_DVO                     3           // ; DVO D
    474 #define PORT_LVDS                      4           // ; Integrated LVDS port
    475 #define PORT_ANALOG_TV                 5           // ; Integrated TV port
    476 #define PORT_CRT                       6           // ; integrated Analog port
    477 #define PORT_B_DP                      7           // ; DisplayPort B
    478 #define PORT_C_DP                      8           // ; DisplayPort C
    479 #define PORT_D_DP                      9           // ; DisplayPort D
    480 #define PORT_A_DP                      10          // ; DisplayPort A (for eDP on ILK)
    481 #define PORT_B_HDMI                    11          // ; HDMI B
    482 #define PORT_C_HDMI                    12          // ; HDMI C
    483 #define PORT_D_HDMI                    13          // ; HDMI D
    484 #define PORT_B_DVI                     14          // ; DVI B
    485 #define PORT_C_DVI                     15          // ; DVI C
    486 #define PORT_D_DVI                     16          // ; DVI D
    487 #define PORT_MIPI_A                    21          // ; MIPI
    488 #define PORT_MIPI_B                    22
    489 #define PORT_MIPI_C                    23
    490 
    491 
    492 extern BOOLEAN gConnectAllHappened;
    493 extern UINTN gCallbackKey;
    494 
    495 VOID
    496 BdsBootDeviceSelect (
    497   VOID
    498 );
    499 VOID FastBoot(VOID);
    500 
    501 extern BOOLEAN    mModeInitialized;
    502 
    503 //
    504 // Boot video resolution and text mode.
    505 //
    506 extern UINT32     mBootHorizontalResolution    ;
    507 extern UINT32     mBootVerticalResolution      ;
    508 extern UINT32     mBootTextModeColumn          ;
    509 extern UINT32     mBootTextModeRow             ;
    510 
    511 //
    512 // BIOS setup video resolution and text mode.
    513 //
    514 extern UINT32     mSetupTextModeColumn         ;
    515 extern UINT32     mSetupTextModeRow            ;
    516 extern UINT32     mSetupHorizontalResolution   ;
    517 extern UINT32     mSetupVerticalResolution     ;
    518 extern EFI_STATUS BdsSetConsoleMode (BOOLEAN);
    519 #endif // _BDS_PLATFORM_H
    520