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