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