Home | History | Annotate | Download | only in PlatformBootManagerLib
      1 /** @file
      2 Defined the platform specific device path which will be filled to
      3 ConIn/ConOut variables.
      4 
      5 Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions of the BSD License
      8 which accompanies this distribution.  The full text of the license may be found at
      9 http://opensource.org/licenses/bsd-license.php
     10 
     11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #include "PlatformBootManager.h"
     17 
     18 ///
     19 /// the short form device path for Usb keyboard
     20 ///
     21 #define CLASS_HID           3
     22 #define SUBCLASS_BOOT       1
     23 #define PROTOCOL_KEYBOARD   1
     24 
     25 ///
     26 /// PcdDefaultTerminalType values
     27 ///
     28 #define PCANSITYPE                0
     29 #define VT100TYPE                 1
     30 #define VT100PLUSTYPE             2
     31 #define VTUTF8TYPE                3
     32 #define TTYTERMTYPE               4
     33 
     34 //
     35 // Below is the platform console device path
     36 //
     37 typedef struct {
     38   ACPI_HID_DEVICE_PATH            PciRootBridge;
     39   PCI_DEVICE_PATH                 PciUart;
     40   UART_DEVICE_PATH                Uart;
     41   VENDOR_DEVICE_PATH              TerminalType;
     42   EFI_DEVICE_PATH_PROTOCOL        End;
     43 } PCI_UART_DEVICE_PATH;
     44 
     45 typedef struct {
     46   VENDOR_DEVICE_PATH        VendorHardware;
     47   UART_DEVICE_PATH          Uart;
     48   VENDOR_DEVICE_PATH        TerminalType;
     49   EFI_DEVICE_PATH_PROTOCOL  End;
     50 } VENDOR_UART_DEVICE_PATH;
     51 
     52 typedef struct {
     53   USB_CLASS_DEVICE_PATH           UsbClass;
     54   EFI_DEVICE_PATH_PROTOCOL        End;
     55 } USB_CLASS_FORMAT_DEVICE_PATH;
     56 
     57 #define PNPID_DEVICE_PATH_NODE(PnpId) \
     58   { \
     59     { \
     60       ACPI_DEVICE_PATH, \
     61       ACPI_DP, \
     62       { \
     63         (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \
     64         (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \
     65       } \
     66     }, \
     67     EISA_PNP_ID((PnpId)), \
     68     0 \
     69   }
     70 
     71 #define PCI_DEVICE_PATH_NODE(Func, Dev) \
     72   { \
     73     { \
     74       HARDWARE_DEVICE_PATH, \
     75       HW_PCI_DP, \
     76       { \
     77         (UINT8) (sizeof (PCI_DEVICE_PATH)), \
     78         (UINT8) ((sizeof (PCI_DEVICE_PATH)) >> 8) \
     79       }, \
     80     }, \
     81     (Func), \
     82     (Dev) \
     83   }
     84 
     85 #define gEndEntire \
     86   { \
     87     END_DEVICE_PATH_TYPE, \
     88     END_ENTIRE_DEVICE_PATH_SUBTYPE, \
     89     { \
     90       END_DEVICE_PATH_LENGTH, \
     91       0 \
     92     } \
     93   }
     94 
     95 //
     96 // Platform specific serial device path
     97 //
     98 PCI_UART_DEVICE_PATH   gPciUartDevicePath0 = {
     99   PNPID_DEVICE_PATH_NODE(0x0A03),
    100   PCI_DEVICE_PATH_NODE(1, 20),
    101   {
    102     {
    103       MESSAGING_DEVICE_PATH,
    104       MSG_UART_DP,
    105       {
    106         (UINT8)(sizeof (UART_DEVICE_PATH)),
    107         (UINT8)((sizeof (UART_DEVICE_PATH)) >> 8)
    108       }
    109     },
    110     0,         // Reserved
    111     921600,    // BaudRate
    112     8,         // DataBits
    113     1,         // Parity
    114     1          // StopBits
    115   },
    116   {
    117     {
    118       MESSAGING_DEVICE_PATH,
    119       MSG_VENDOR_DP,
    120       {
    121         (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
    122         (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
    123       },
    124     },
    125     DEVICE_PATH_MESSAGING_PC_ANSI
    126   },
    127   gEndEntire
    128 };
    129 
    130 PCI_UART_DEVICE_PATH   gPciUartDevicePath1 = {
    131   PNPID_DEVICE_PATH_NODE(0x0A03),
    132   PCI_DEVICE_PATH_NODE(5, 20),
    133   {
    134     {
    135       MESSAGING_DEVICE_PATH,
    136       MSG_UART_DP,
    137       {
    138         (UINT8)(sizeof (UART_DEVICE_PATH)),
    139         (UINT8)((sizeof (UART_DEVICE_PATH)) >> 8)
    140       }
    141     },
    142     0,         // Reserved
    143     921600,    // BaudRate
    144     8,         // DataBits
    145     1,         // Parity
    146     1          // StopBits
    147   },
    148   {
    149     {
    150       MESSAGING_DEVICE_PATH,
    151       MSG_VENDOR_DP,
    152       {
    153         (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
    154         (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
    155       }
    156     },
    157     DEVICE_PATH_MESSAGING_PC_ANSI
    158   },
    159   gEndEntire
    160 };
    161 
    162 VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
    163   {
    164     {
    165       HARDWARE_DEVICE_PATH,
    166       HW_VENDOR_DP,
    167       {
    168         (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
    169         (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
    170       }
    171     },
    172     EFI_DEBUG_AGENT_GUID,
    173   },
    174   {
    175     {
    176       MESSAGING_DEVICE_PATH,
    177       MSG_UART_DP,
    178       {
    179         (UINT8) (sizeof (UART_DEVICE_PATH)),
    180         (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8)
    181       }
    182     },
    183     0,  // Reserved
    184     0,  // BaudRate - Default
    185     0,  // DataBits - Default
    186     0,  // Parity   - Default
    187     0,  // StopBits - Default
    188   },
    189   {
    190     {
    191       MESSAGING_DEVICE_PATH,
    192       MSG_VENDOR_DP,
    193       {
    194         (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
    195         (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
    196       }
    197     },
    198     DEVICE_PATH_MESSAGING_PC_ANSI
    199   },
    200   gEndEntire
    201 };
    202 
    203 USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboardDevicePath = {
    204   {
    205     {
    206       MESSAGING_DEVICE_PATH,
    207       MSG_USB_CLASS_DP,
    208       {
    209         (UINT8)(sizeof (USB_CLASS_DEVICE_PATH)),
    210         (UINT8)((sizeof (USB_CLASS_DEVICE_PATH)) >> 8)
    211       }
    212     },
    213     0xffff,              // VendorId  - Match any vendor
    214     0xffff,              // ProductId - Match any product
    215     CLASS_HID,           // DeviceClass
    216     SUBCLASS_BOOT,       // DeviceSubClass
    217     PROTOCOL_KEYBOARD    // DeviceProtocol
    218   },
    219   gEndEntire
    220 };
    221 
    222 //
    223 // Predefined platform default console device path
    224 //
    225 PLATFORM_CONSOLE_CONNECT_ENTRY   gPlatformConsole[] = {
    226   { (EFI_DEVICE_PATH_PROTOCOL *) &gPciUartDevicePath0,         (CONSOLE_OUT | CONSOLE_IN) },
    227   { (EFI_DEVICE_PATH_PROTOCOL *) &gPciUartDevicePath1,         (CONSOLE_OUT | CONSOLE_IN) },
    228   { (EFI_DEVICE_PATH_PROTOCOL *) &gDebugAgentUartDevicePath,   (CONSOLE_OUT | CONSOLE_IN) },
    229   { (EFI_DEVICE_PATH_PROTOCOL *) &gUsbClassKeyboardDevicePath, (CONSOLE_IN)               },
    230   { NULL, 0 }
    231 };
    232 
    233 EFI_STATUS
    234 EFIAPI
    235 InitializePlatformBootManagerLib (
    236   IN EFI_HANDLE        ImageHandle,
    237   IN EFI_SYSTEM_TABLE  *SystemTable
    238   )
    239 {
    240   EFI_GUID  *TerminalTypeGuid;
    241 
    242   //
    243   // Update UART device path nodes based on UART PCD settings
    244   //
    245   gPciUartDevicePath0.Uart.BaudRate = PcdGet64 (PcdUartDefaultBaudRate);
    246   gPciUartDevicePath0.Uart.DataBits = PcdGet8 (PcdUartDefaultDataBits);
    247   gPciUartDevicePath0.Uart.Parity   = PcdGet8 (PcdUartDefaultParity);
    248   gPciUartDevicePath0.Uart.StopBits = PcdGet8 (PcdUartDefaultStopBits);
    249   gPciUartDevicePath1.Uart.BaudRate = PcdGet64 (PcdUartDefaultBaudRate);
    250   gPciUartDevicePath1.Uart.DataBits = PcdGet8 (PcdUartDefaultDataBits);
    251   gPciUartDevicePath1.Uart.Parity   = PcdGet8 (PcdUartDefaultParity);
    252   gPciUartDevicePath1.Uart.StopBits = PcdGet8 (PcdUartDefaultStopBits);
    253 
    254   //
    255   // Update Vendor device path nodes based on terminal type PCD settings
    256   //
    257   switch (PcdGet8 (PcdDefaultTerminalType)) {
    258   case PCANSITYPE:
    259     TerminalTypeGuid = &gEfiPcAnsiGuid;
    260     break;
    261   case VT100TYPE:
    262     TerminalTypeGuid = &gEfiVT100Guid;
    263     break;
    264   case VT100PLUSTYPE:
    265     TerminalTypeGuid = &gEfiVT100PlusGuid;
    266     break;
    267   case VTUTF8TYPE:
    268     TerminalTypeGuid = &gEfiVTUTF8Guid;
    269     break;
    270   case TTYTERMTYPE:
    271     TerminalTypeGuid = &gEfiTtyTermGuid;
    272     break;
    273   default:
    274     TerminalTypeGuid = &gEfiPcAnsiGuid;
    275     break;
    276   }
    277   CopyGuid (&gPciUartDevicePath0.TerminalType.Guid, TerminalTypeGuid);
    278   CopyGuid (&gPciUartDevicePath1.TerminalType.Guid, TerminalTypeGuid);
    279 
    280   return EFI_SUCCESS;
    281 }
    282