1/** @file 2Defined the platform specific device path which will be filled to 3ConIn/ConOut variables. 4 5Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> 6This program and the accompanying materials 7are licensed and made available under the terms and conditions of the BSD License 8which accompanies this distribution. The full text of the license may be found at 9http://opensource.org/licenses/bsd-license.php 10 11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12WITHOUT 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// 37typedef 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 45typedef 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 52typedef 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// 98PCI_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 130PCI_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 162VENDOR_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 203USB_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// 225PLATFORM_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 233EFI_STATUS 234EFIAPI 235InitializePlatformBootManagerLib ( 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