1 /** @file
2   Platform BDS customizations include file.
3 
4   Copyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR>
5   This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 Module Name:
14 
15   BdsPlatform.h
16 
17 Abstract:
18 
19   Head file for BDS Platform specific code
20 
21 **/
22 
23 #ifndef _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
24 #define _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
25 
26 
27 #include <PiDxe.h>
28 
29 #include <IndustryStandard/Pci.h>
30 #include <IndustryStandard/Acpi.h>
31 #include <IndustryStandard/SmBios.h>
32 #include <IndustryStandard/PeImage.h>
33 
34 #include <Library/DebugLib.h>
35 #include <Library/BaseMemoryLib.h>
36 #include <Library/UefiBootServicesTableLib.h>
37 #include <Library/UefiRuntimeServicesTableLib.h>
38 #include <Library/MemoryAllocationLib.h>
39 #include <Library/BaseLib.h>
40 #include <Library/PcdLib.h>
41 #include <Library/PciLib.h>
42 #include <Library/GenericBdsLib.h>
43 #include <Library/PlatformBdsLib.h>
44 #include <Library/HobLib.h>
45 #include <Library/UefiLib.h>
46 #include <Library/DxeServicesTableLib.h>
47 #include <Library/DevicePathLib.h>
48 #include <Library/IoLib.h>
49 #include <Library/NvVarsFileLib.h>
50 
51 #include <Protocol/Decompress.h>
52 #include <Protocol/PciIo.h>
53 #include <Protocol/FirmwareVolume2.h>
54 #include <Protocol/SimpleFileSystem.h>
55 
56 #include <Guid/Acpi.h>
57 #include <Guid/SmBios.h>
58 #include <Guid/Mps.h>
59 #include <Guid/HobList.h>
60 #include <Guid/GlobalVariable.h>
61 
62 extern BDS_CONSOLE_CONNECT_ENTRY  gPlatformConsole[];
63 extern EFI_DEVICE_PATH_PROTOCOL   *gPlatformConnectSequence[];
64 extern EFI_DEVICE_PATH_PROTOCOL   *gPlatformDriverOption[];
65 extern EFI_DEVICE_PATH_PROTOCOL   *gPlatformRootBridges[];
66 extern ACPI_HID_DEVICE_PATH       gPnpPs2KeyboardDeviceNode;
67 extern ACPI_HID_DEVICE_PATH       gPnp16550ComPortDeviceNode;
68 extern UART_DEVICE_PATH           gUartDeviceNode;
69 extern VENDOR_DEVICE_PATH         gTerminalTypeDeviceNode;
70 //
71 //
72 //
73 #define VarConsoleInpDev        L"ConInDev"
74 #define VarConsoleInp           L"ConIn"
75 #define VarConsoleOutDev        L"ConOutDev"
76 #define VarConsoleOut           L"ConOut"
77 #define VarErrorOutDev          L"ErrOutDev"
78 #define VarErrorOut             L"ErrOut"
79 
80 #define PCI_DEVICE_PATH_NODE(Func, Dev) \
81   { \
82     { \
83       HARDWARE_DEVICE_PATH, \
84       HW_PCI_DP, \
85       { \
86         (UINT8) (sizeof (PCI_DEVICE_PATH)), \
87         (UINT8) ((sizeof (PCI_DEVICE_PATH)) >> 8) \
88       } \
89     }, \
90     (Func), \
91     (Dev) \
92   }
93 
94 #define PNPID_DEVICE_PATH_NODE(PnpId) \
95   { \
96     { \
97       ACPI_DEVICE_PATH, \
98       ACPI_DP, \
99       { \
100         (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \
101         (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \
102       }, \
103     }, \
104     EISA_PNP_ID((PnpId)), \
105     0 \
106   }
107 
108 #define gPciRootBridge \
109   PNPID_DEVICE_PATH_NODE(0x0A03)
110 
111 #define gPciIsaBridge \
112   PCI_DEVICE_PATH_NODE(0, 0x1f)
113 
114 #define gP2PBridge \
115   PCI_DEVICE_PATH_NODE(0, 0x1e)
116 
117 #define gPnpPs2Keyboard \
118   PNPID_DEVICE_PATH_NODE(0x0303)
119 
120 #define gPnp16550ComPort \
121   PNPID_DEVICE_PATH_NODE(0x0501)
122 
123 #define gUart \
124   { \
125     { \
126       MESSAGING_DEVICE_PATH, \
127       MSG_UART_DP, \
128       { \
129         (UINT8) (sizeof (UART_DEVICE_PATH)), \
130         (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8) \
131       } \
132     }, \
133     0, \
134     115200, \
135     8, \
136     1, \
137     1 \
138   }
139 
140 #define gPcAnsiTerminal \
141   { \
142     { \
143       MESSAGING_DEVICE_PATH, \
144       MSG_VENDOR_DP, \
145       { \
146         (UINT8) (sizeof (VENDOR_DEVICE_PATH)), \
147         (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) \
148       } \
149     }, \
150     DEVICE_PATH_MESSAGING_PC_ANSI \
151   }
152 
153 #define gVt100pTerminal \
154   { \
155     { \
156       MESSAGING_DEVICE_PATH, \
157       MSG_VENDOR_DP, \
158       { \
159         (UINT8) (sizeof (VENDOR_DEVICE_PATH)), \
160         (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) \
161       } \
162     }, \
163     DEVICE_PATH_MESSAGING_VT_100_PLUS \
164   }
165 
166 
167 #define gEndEntire \
168   { \
169     END_DEVICE_PATH_TYPE, \
170     END_ENTIRE_DEVICE_PATH_SUBTYPE, \
171     { \
172       END_DEVICE_PATH_LENGTH, \
173       0 \
174     } \
175   }
176 
177 #define PCI_CLASS_SCC          0x07
178 #define PCI_SUBCLASS_SERIAL    0x00
179 #define PCI_IF_16550           0x02
180 #define IS_PCI_16550SERIAL(_p)           IS_CLASS3 (_p, PCI_CLASS_SCC, PCI_SUBCLASS_SERIAL, PCI_IF_16550)
181 
182 #define EFI_SYSTEM_TABLE_MAX_ADDRESS 0xFFFFFFFF
183 #define SYS_TABLE_PAD(ptr) (((~ptr) +1) & 0x07 )
184 
185 #define IS_PCI_ISA_PDECODE(_p)        IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA_PDECODE, 0)
186 
187 //
188 // Platform Root Bridge
189 //
190 typedef struct {
191   ACPI_HID_DEVICE_PATH      PciRootBridge;
192   EFI_DEVICE_PATH_PROTOCOL  End;
193 } PLATFORM_ROOT_BRIDGE_DEVICE_PATH;
194 
195 typedef struct {
196   ACPI_HID_DEVICE_PATH      PciRootBridge;
197   PCI_DEVICE_PATH           IsaBridge;
198   ACPI_HID_DEVICE_PATH      Keyboard;
199   EFI_DEVICE_PATH_PROTOCOL  End;
200 } PLATFORM_ISA_KEYBOARD_DEVICE_PATH;
201 
202 typedef struct {
203   ACPI_HID_DEVICE_PATH      PciRootBridge;
204   PCI_DEVICE_PATH           IsaBridge;
205   ACPI_HID_DEVICE_PATH      IsaSerial;
206   UART_DEVICE_PATH          Uart;
207   VENDOR_DEVICE_PATH        TerminalType;
208   EFI_DEVICE_PATH_PROTOCOL  End;
209 } PLATFORM_ISA_SERIAL_DEVICE_PATH;
210 
211 typedef struct {
212   ACPI_HID_DEVICE_PATH      PciRootBridge;
213   PCI_DEVICE_PATH           VgaDevice;
214   EFI_DEVICE_PATH_PROTOCOL  End;
215 } PLATFORM_DUMMY_PCI_VGA_DEVICE_PATH;
216 
217 typedef struct {
218   ACPI_HID_DEVICE_PATH      PciRootBridge;
219   PCI_DEVICE_PATH           PciBridge;
220   PCI_DEVICE_PATH           SerialDevice;
221   UART_DEVICE_PATH          Uart;
222   VENDOR_DEVICE_PATH        TerminalType;
223   EFI_DEVICE_PATH_PROTOCOL  End;
224 } PLATFORM_DUMMY_PCI_SERIAL_DEVICE_PATH;
225 
226 //
227 // the short form device path for Usb keyboard
228 //
229 #define CLASS_HID           3
230 #define SUBCLASS_BOOT       1
231 #define PROTOCOL_KEYBOARD   1
232 
233 typedef struct {
234   USB_CLASS_DEVICE_PATH           UsbClass;
235   EFI_DEVICE_PATH_PROTOCOL        End;
236 } USB_CLASS_FORMAT_DEVICE_PATH;
237 
238 extern PLATFORM_ROOT_BRIDGE_DEVICE_PATH  gPlatformRootBridge0;
239 
240 //
241 // Platform BDS Functions
242 //
243 
244 VOID
245 PlatformBdsGetDriverOption (
246   IN LIST_ENTRY               *BdsDriverLists
247   );
248 
249 EFI_STATUS
250 BdsMemoryTest (
251   EXTENDMEM_COVERAGE_LEVEL Level
252   );
253 
254 EFI_STATUS
255 PlatformBdsShowProgress (
256   EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground,
257   EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground,
258   CHAR16                        *Title,
259   EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor,
260   UINTN                         Progress,
261   UINTN                         PreviousValue
262   );
263 
264 VOID
265 PlatformBdsConnectSequence (
266   VOID
267   );
268 
269 EFI_STATUS
270 ProcessCapsules (
271   EFI_BOOT_MODE BootMode
272   );
273 
274 EFI_STATUS
275 PlatformBdsConnectConsole (
276   IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
277   );
278 
279 EFI_STATUS
280 PlatformBdsNoConsoleAction (
281   VOID
282   );
283 
284 EFI_STATUS
285 ConvertMpsTable (
286   IN OUT  VOID     **Table
287   );
288 
289 EFI_STATUS
290 ConvertSmbiosTable (
291   IN OUT VOID       **Table
292   );
293 
294 EFI_STATUS
295 ConvertAcpiTable (
296  IN      UINTN      TableLen,
297  IN OUT  VOID       **Table
298   );
299 
300 EFI_STATUS
301 ConvertSystemTable (
302  IN     EFI_GUID   *TableGuid,
303  IN OUT VOID       **Table
304   );
305 
306 VOID
307 PlatformBdsEnterFrontPage (
308   IN UINT16                 TimeoutDefault,
309   IN BOOLEAN                ConnectAllHappened
310   );
311 
312 #endif // _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
313