• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   The EFI Legacy BIOS Patform Protocol is used to mate a Legacy16
3   implementation with this EFI code. The EFI driver that produces
4   the Legacy BIOS protocol is generic and consumes this protocol.
5   A driver that matches the Legacy16 produces this protocol
6 
7 Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
8 This program and the accompanying materials are licensed and made available under
9 the terms and conditions of the BSD License that accompanies this distribution.
10 The full text of the license may be found at
11 http://opensource.org/licenses/bsd-license.php.
12 
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 
16   @par Revision Reference:
17   This protocol is defined in Framework for EFI Compatibility Support Module spec
18   Version 0.97.
19 
20 **/
21 
22 #ifndef _EFI_LEGACY_BIOS_PLATFORM_H_
23 #define _EFI_LEGACY_BIOS_PLATFORM_H_
24 
25 ///
26 /// Legacy BIOS Platform depends on HDD_INFO and EFI_COMPATIBILITY16_TABLE that
27 /// are defined with the Legacy BIOS Protocol
28 ///
29 #include <Protocol/LegacyBios.h>
30 
31 #define EFI_LEGACY_BIOS_PLATFORM_PROTOCOL_GUID \
32   { \
33     0x783658a3, 0x4172, 0x4421, {0xa2, 0x99, 0xe0, 0x9, 0x7, 0x9c, 0xc, 0xb4 } \
34   }
35 
36 typedef struct _EFI_LEGACY_BIOS_PLATFORM_PROTOCOL EFI_LEGACY_BIOS_PLATFORM_PROTOCOL;
37 
38 /**
39   This enum specifies the Mode param values for GetPlatformInfo()
40 **/
41 typedef enum {
42   ///
43   /// This mode is invoked twice. The first invocation has LegacySegment and
44   /// LegacyOffset set to 0. The mode returns the MP table address in EFI memory, along with its size.
45   /// The second invocation has LegacySegment and LegacyOffset set to the location
46   /// in the 0xF0000 or 0xE0000 block to which the MP table is to be copied. The second
47   /// invocation allows any MP table address fixes to occur in the EFI memory copy of the
48   /// MP table. The caller, not EfiGetPlatformBinaryMpTable, copies the modified MP
49   /// table to the allocated region in 0xF0000 or 0xE0000 block after the second invocation.
50   ///
51   /// The function parameters associated with this mode are:
52   ///
53   ///   Table Pointer to the MP table.
54   ///
55   ///   TableSize Size in bytes of the MP table.
56   ///
57   ///   Location Location to place table. 0x00. Either 0xE0000 or 0xF0000 64 KB blocks.
58   ///     Bit 0 = 1 0xF0000 64 KB block.
59   ///     Bit 1 = 1 0xE0000 64 KB block.
60   ///     Multiple bits can be set.
61   ///
62   ///   Alignment Bit-mapped address alignment granularity.
63   ///     The first nonzero bit from the right is the address granularity.
64   ///
65   //    LegacySegment Segment in which EfiCompatibility code will place the MP table.
66   ///
67   ///   LegacyOffset Offset in which EfiCompatibility code will place the MP table.
68   ///
69   /// The return values associated with this mode are:
70   ///
71   ///   EFI_SUCCESS The MP table was returned.
72   ///
73   ///   EFI_UNSUPPORTED The MP table is not supported on this platform.
74   ///
75   EfiGetPlatformBinaryMpTable      = 0,
76   ///
77   /// This mode returns a block of data. The content and usage is IBV or OEM defined.
78   /// OEMs or IBVs normally use this function for nonstandard Compatibility16 runtime soft
79   /// INTs. It is the responsibility of this routine to coalesce multiple OEM 16 bit functions, if
80   /// they exist, into one coherent package that is understandable by the Compatibility16 code.
81   /// This function is invoked twice. The first invocation has LegacySegment and
82   /// LegacyOffset set to 0. The function returns the table address in EFI memory, as well as its size.
83   /// The second invocation has LegacySegment and LegacyOffset set to the location
84   /// in the 0xF0000 or 0xE0000 block to which the data (table) is to be copied. The second
85   /// invocation allows any data (table) address fixes to occur in the EFI memory copy of
86   /// the table. The caller, not GetOemIntData(), copies the modified data (table) to the
87   /// allocated region in 0xF0000 or 0xE0000 block after the second invocation.
88   ///
89   /// The function parameters associated with this mode are:
90   ///
91   ///   Table Pointer to OEM legacy 16 bit code or data.
92   ///
93   ///   TableSize Size of data.
94   ///
95   ///   Location Location to place table. 0x00. Either 0xE0000 or 0xF0000 64 KB blocks.
96   ///       Bit 0 = 1 0xF0000 64 KB block.
97   ///       Bit 1 = 1 0xE0000 64 KB block.
98   ///       Multiple bits can be set.
99   ///
100   ///   Alignment Bit mapped address alignment granularity.
101   ///     The first nonzero bit from the right is the address granularity.
102   ///
103   ///   LegacySegment Segment in which EfiCompatibility code will place the table or data.
104   ///
105   ///   LegacyOffset Offset in which EfiCompatibility code will place the table or data.
106   ///
107   /// The return values associated with this mode are:
108   ///
109   ///   EFI_SUCCESS The data was returned successfully.
110   ///
111   ///   EFI_UNSUPPORTED Oem INT is not supported on this platform.
112   ///
113   EfiGetPlatformBinaryOemIntData   = 1,
114   ///
115   /// This mode returns a block of data. The content and usage is IBV defined. OEMs or
116   /// IBVs normally use this mode for nonstandard Compatibility16 runtime 16 bit routines. It
117   /// is the responsibility of this routine to coalesce multiple OEM 16 bit functions, if they
118   /// exist, into one coherent package that is understandable by the Compatibility16 code.
119   ///
120   /// Example usage: A legacy mobile BIOS that has a pre-existing runtime
121   /// interface to return the battery status to calling applications.
122   ///
123   /// This mode is invoked twice. The first invocation has LegacySegment and
124   /// LegacyOffset set to 0. The mode returns the table address in EFI memory and its size.
125   /// The second invocation has LegacySegment and LegacyOffset set to the location
126   /// in the 0xF0000 or 0xE0000 block to which the table is to be copied. The second
127   /// invocation allows any table address fixes to occur in the EFI memory copy of the table.
128   /// The caller, not EfiGetPlatformBinaryOem16Data, copies the modified table to
129   /// the allocated region in 0xF0000 or 0xE0000 block after the second invocation.
130   ///
131   /// The function parameters associated with this mode are:
132   ///
133   ///   Table Pointer to OEM legacy 16 bit code or data.
134   ///
135   ///   TableSize Size of data.
136   ///
137   ///   Location Location to place the table. 0x00. Either 0xE0000 or 0xF0000 64 KB blocks.
138   ///      Bit 0 = 1 0xF0000 64 KB block.
139   ///      Bit 1 = 1 0xE0000 64 KB block.
140   ///      Multiple bits can be set.
141   ///
142   ///   Alignment Bit mapped address alignment granularity.
143   ///     The first nonzero bit from the right is the address granularity.
144   ///
145   ///   LegacySegment Segment in which EfiCompatibility code will place the table or data.
146   ///
147   ///   LegacyOffset Offset in which EfiCompatibility code will place the table or data.
148   ///
149   /// The return values associated with this mode are:
150   ///
151   ///   EFI_SUCCESS The data was returned successfully.
152   ///
153   ///   EFI_UNSUPPORTED Oem16 is not supported on this platform.
154   ///
155   EfiGetPlatformBinaryOem16Data    = 2,
156 ///
157 /// This mode returns a block of data. The content and usage are IBV defined. OEMs or
158 /// IBVs normally use this mode for nonstandard Compatibility16 runtime 32 bit routines. It
159 /// is the responsibility of this routine to coalesce multiple OEM 32 bit functions, if they
160 /// exist, into one coherent package that is understandable by the Compatibility16 code.
161 ///
162 /// Example usage: A legacy mobile BIOS that has a pre existing runtime
163 /// interface to return the battery status to calling applications.
164 ///
165 /// This mode is invoked twice. The first invocation has LegacySegment and
166 /// LegacyOffset set to 0. The mode returns the table address in EFI memory and its size.
167 ///
168 /// The second invocation has LegacySegment and LegacyOffset set to the location
169 /// in the 0xF0000 or 0xE0000 block to which the table is to be copied. The second
170 /// invocation allows any table address fix ups to occur in the EFI memory copy of the table.
171 /// The caller, not EfiGetPlatformBinaryOem32Data, copies the modified table to
172 /// the allocated region in 0xF0000 or 0xE0000 block after the second invocation..
173 ///
174 /// Note: There are two generic mechanisms by which this mode can be used.
175 /// Mechanism 1: This mode returns the data and the Legacy BIOS Protocol copies
176 /// the data into the F0000 or E0000 block in the Compatibility16 code. The
177 /// EFI_COMPATIBILITY16_TABLE entries Oem32Segment and Oem32Offset can
178 /// be viewed as two UINT16 entries.
179 /// Mechanism 2: This mode directly fills in the EFI_COMPATIBILITY16_TABLE with
180 /// a pointer to the INT15 E820 region containing the 32 bit code. It returns
181 /// EFI_UNSUPPORTED. The EFI_COMPATIBILITY16_TABLE entries,
182 /// Oem32Segment and Oem32Offset, can be viewed as two UINT16 entries or
183 /// as a single UINT32 entry as determined by the IBV.
184 ///
185 /// The function parameters associated with this mode are:
186 ///
187 ///   TableSize Size of data.
188 ///
189 ///   Location Location to place the table. 0x00 or 0xE0000 or 0xF0000 64 KB blocks.
190 ///       Bit 0 = 1 0xF0000 64 KB block.
191 ///       Bit 1 = 1 0xE0000 64 KB block.
192 ///       Multiple bits can be set.
193 ///
194 ///   Alignment Bit mapped address alignment granularity.
195 ///       The first nonzero bit from the right is the address granularity.
196 ///
197 ///   LegacySegment Segment in which EfiCompatibility code will place the table or data.
198 ///
199 ///   LegacyOffset Offset in which EfiCompatibility code will place the table or data.
200 ///
201 /// The return values associated with this mode are:
202 ///   EFI_SUCCESS The data was returned successfully.
203 ///   EFI_UNSUPPORTED Oem32 is not supported on this platform.
204 ///
205 EfiGetPlatformBinaryOem32Data    = 3,
206   ///
207   /// This mode returns a TPM binary image for the onboard TPM device.
208   ///
209   /// The function parameters associated with this mode are:
210   ///
211   ///   Table TPM binary image for the onboard TPM device.
212   ///
213   ///   TableSize Size of BinaryImage in bytes.
214   ///
215   ///   Location Location to place the table. 0x00. Either 0xE0000 or 0xF0000 64 KB blocks.
216   ///      Bit 0 = 1 0xF0000 64 KB block.
217   ///      Bit 1 = 1 0xE0000 64 KB block.
218   ///      Multiple bits can be set.
219   ///
220   ///   Alignment Bit mapped address alignment granularity.
221   ///     The first nonzero bit from the right is the address granularity.
222   ///
223   ///   LegacySegment Segment in which EfiCompatibility code will place the table or data.
224   ///
225   ///   LegacyOffset Offset in which EfiCompatibility code will place the table or data.
226   ///
227   /// The return values associated with this mode are:
228   ///
229   ///   EFI_SUCCESS BinaryImage is valid.
230   ///
231   ///   EFI_UNSUPPORTED Mode is not supported on this platform.
232   ///
233   ///   EFI_NOT_FOUND No BinaryImage was found.
234   ///
235   EfiGetPlatformBinaryTpmBinary    = 4,
236   ///
237   /// The mode finds the Compatibility16 Rom Image.
238   ///
239   /// The function parameters associated with this mode are:
240   ///
241   ///    System ROM image for the platform.
242   ///
243   ///    TableSize Size of Table in bytes.
244   ///
245   ///    Location Ignored.
246   ///
247   ///    Alignment Ignored.
248   ///
249   ///    LegacySegment Ignored.
250   ///
251   ///    LegacyOffset Ignored.
252   ///
253   /// The return values associated with this mode are:
254   ///
255   ///    EFI_SUCCESS ROM image found.
256   ///
257   ///    EFI_NOT_FOUND ROM not found.
258   ///
259   EfiGetPlatformBinarySystemRom    = 5,
260   ///
261   /// This mode returns the Base address of PciExpress memory mapped configuration
262   /// address space.
263   ///
264   /// The function parameters associated with this mode are:
265   ///
266   ///    Table System ROM image for the platform.
267   ///
268   ///    TableSize Size of Table in bytes.
269   ///
270   ///    Location Ignored.
271   ///
272   ///    Alignment Ignored.
273   ///
274   ///    LegacySegment Ignored.
275   ///
276   ///    LegacyOffset Ignored.
277   ///
278   /// The return values associated with this mode are:
279   ///
280   ///   EFI_SUCCESS Address is valid.
281   ///
282   ///   EFI_UNSUPPORTED System does not PciExpress.
283   ///
284   EfiGetPlatformPciExpressBase     = 6,
285   ///
286   EfiGetPlatformPmmSize            = 7,
287   ///
288   EfiGetPlatformEndOpromShadowAddr = 8,
289   ///
290 } EFI_GET_PLATFORM_INFO_MODE;
291 
292 /**
293   This enum specifies the Mode param values for GetPlatformHandle().
294 **/
295 typedef enum {
296   ///
297   /// This mode returns the Compatibility16 policy for the device that should be the VGA
298   /// controller used during a Compatibility16 boot.
299   ///
300   /// The function parameters associated with this mode are:
301   ///
302   ///   Type 0x00.
303   ///
304   ///   HandleBuffer Buffer of all VGA handles found.
305   ///
306   ///   HandleCount Number of VGA handles found.
307   ///
308   ///   AdditionalData NULL.
309   ///
310   EfiGetPlatformVgaHandle       = 0,
311   ///
312   /// This mode returns the Compatibility16 policy for the device that should be the IDE
313   /// controller used during a Compatibility16 boot.
314   ///
315   /// The function parameters associated with this mode are:
316   ///
317   ///   Type 0x00.
318   ///
319   ///   HandleBuffer Buffer of all IDE handles found.
320   ///
321   ///   HandleCount Number of IDE handles found.
322   ///
323   ///   AdditionalData Pointer to HddInfo.
324   ///     Information about all onboard IDE controllers.
325   ///
326   EfiGetPlatformIdeHandle       = 1,
327   ///
328   /// This mode returns the Compatibility16 policy for the device that should be the ISA bus
329   /// controller used during a Compatibility16 boot.
330   ///
331   /// The function parameters associated with this mode are:
332   ///
333   ///   Type 0x00.
334   ///
335   ///   HandleBuffer Buffer of all ISA bus handles found.
336   ///
337   ///   HandleCount Number of ISA bus handles found.
338   ///
339   ///   AdditionalData NULL.
340   ///
341   EfiGetPlatformIsaBusHandle    = 2,
342   ///
343   /// This mode returns the Compatibility16 policy for the device that should be the USB
344   /// device used during a Compatibility16 boot.
345   ///
346   /// The function parameters associated with this mode are:
347   ///
348   ///   Type 0x00.
349   ///
350   ///   HandleBuffer Buffer of all USB handles found.
351   ///
352   ///   HandleCount Number of USB bus handles found.
353   ///
354   ///   AdditionalData NULL.
355   ///
356   EfiGetPlatformUsbHandle       = 3
357 } EFI_GET_PLATFORM_HANDLE_MODE;
358 
359 /**
360   This enum specifies the Mode param values for PlatformHooks().
361   Note: Any OEM defined hooks start with 0x8000.
362 **/
363 typedef enum {
364   ///
365   /// This mode allows any preprocessing before scanning OpROMs.
366   ///
367   /// The function parameters associated with this mode are:
368   ///
369   ///     Type 0.
370   ///
371   ///     DeviceHandle Handle of device OpROM is associated with.
372   ///
373   ///     ShadowAddress Address where OpROM is shadowed.
374   ///
375   ///     Compatibility16Table NULL.
376   ///
377   ///     AdditionalData NULL.
378   ///
379   EfiPlatformHookPrepareToScanRom = 0,
380   ///
381   /// This mode shadows legacy OpROMS that may not have a physical device associated with
382   /// them. It returns EFI_SUCCESS if the ROM was shadowed.
383   ///
384   /// The function parameters associated with this mode are:
385   ///
386   ///     Type 0.
387   ///
388   ///     DeviceHandle 0.
389   ///
390   ///     ShadowAddress First free OpROM area, after other OpROMs have been dispatched..
391   ///
392   ///     Compatibility16Table Pointer to the Compatability16 Table.
393   ///
394   ///       AdditionalData NULL.
395   ///
396   EfiPlatformHookShadowServiceRoms= 1,
397   ///
398   /// This mode allows platform to perform any required operation after an OpROM has
399   /// completed its initialization.
400   ///
401   /// The function parameters associated with this mode are:
402   ///
403   ///       Type 0.
404   ///
405   ///       DeviceHandle Handle of device OpROM is associated with.
406   ///
407   ///       ShadowAddress Address where OpROM is shadowed.
408   ///
409   ///       Compatibility16Table NULL.
410   ///
411   ///       AdditionalData NULL.
412   ///
413   EfiPlatformHookAfterRomInit     = 2
414 } EFI_GET_PLATFORM_HOOK_MODE;
415 
416 ///
417 /// This IRQ has not been assigned to PCI.
418 ///
419 #define PCI_UNUSED        0x00
420 ///
421 /// This IRQ has been assigned to PCI.
422 ///
423 #define PCI_USED          0xFF
424 ///
425 /// This IRQ has been used by an SIO legacy device and cannot be used by PCI.
426 ///
427 #define LEGACY_USED       0xFE
428 
429 #pragma pack(1)
430 
431 typedef struct {
432   ///
433   /// IRQ for this entry.
434   ///
435   UINT8 Irq;
436   ///
437   /// Status of this IRQ.
438   ///
439   /// PCI_UNUSED 0x00. This IRQ has not been assigned to PCI.
440   ///
441   /// PCI_USED 0xFF. This IRQ has been assigned to PCI.
442   ///
443   /// LEGACY_USED 0xFE. This IRQ has been used by an SIO legacy
444   /// device and cannot be used by PCI.
445   ///
446   UINT8 Used;
447 } EFI_LEGACY_IRQ_PRIORITY_TABLE_ENTRY;
448 
449 //
450 // Define PIR table structures
451 //
452 #define EFI_LEGACY_PIRQ_TABLE_SIGNATURE SIGNATURE_32 ('$', 'P', 'I', 'R')
453 
454 typedef struct {
455   ///
456   /// $PIR.
457   ///
458   UINT32  Signature;
459   ///
460   /// 0x00.
461   ///
462   UINT8   MinorVersion;
463   ///
464   /// 0x01 for table version 1.0.
465   ///
466   UINT8   MajorVersion;
467   ///
468   /// 0x20 + RoutingTableEntries * 0x10.
469   ///
470   UINT16  TableSize;
471   ///
472   /// PCI interrupt router bus.
473   ///
474   UINT8   Bus;
475   ///
476   /// PCI interrupt router device/function.
477   ///
478   UINT8   DevFun;
479   ///
480   /// If nonzero, bit map of IRQs reserved for PCI.
481   ///
482   UINT16  PciOnlyIrq;
483   ///
484   /// Vendor ID of a compatible PCI interrupt router.
485   ///
486   UINT16  CompatibleVid;
487   ///
488   /// Device ID of a compatible PCI interrupt router.
489   ///
490   UINT16  CompatibleDid;
491   ///
492   /// If nonzero, a value passed directly to the IRQ miniport's Initialize function.
493   ///
494   UINT32  Miniport;
495   ///
496   /// Reserved for future usage.
497   ///
498   UINT8   Reserved[11];
499   ///
500   /// This byte plus the sum of all other bytes in the LocalPirqTable equal 0x00.
501   ///
502   UINT8   Checksum;
503 } EFI_LEGACY_PIRQ_TABLE_HEADER;
504 
505 
506 typedef struct {
507   ///
508   /// If nonzero, a value assigned by the IBV.
509   ///
510   UINT8   Pirq;
511   ///
512   /// If nonzero, the IRQs that can be assigned to this device.
513   ///
514   UINT16  IrqMask;
515 } EFI_LEGACY_PIRQ_ENTRY;
516 
517 typedef struct {
518   ///
519   /// PCI bus of the entry.
520   ///
521   UINT8                 Bus;
522   ///
523   /// PCI device of this entry.
524   ///
525   UINT8                 Device;
526   ///
527   /// An IBV value and IRQ mask for PIRQ pins A through D.
528   ///
529   EFI_LEGACY_PIRQ_ENTRY PirqEntry[4];
530   ///
531   /// If nonzero, the slot number assigned by the board manufacturer.
532   ///
533   UINT8                 Slot;
534   ///
535   /// Reserved for future use.
536   ///
537   UINT8                 Reserved;
538 } EFI_LEGACY_IRQ_ROUTING_ENTRY;
539 
540 #pragma pack()
541 
542 
543 /**
544   Finds the binary data or other platform information.
545 
546   @param  This                  The protocol instance pointer.
547   @param  Mode                  Specifies what data to return. See See EFI_GET_PLATFORM_INFO_MODE enum.
548   @param  Table                 Mode specific.  See EFI_GET_PLATFORM_INFO_MODE enum.
549   @param  TableSize            	Mode specific.  See EFI_GET_PLATFORM_INFO_MODE enum.
550   @param  Location             	Mode specific.  See EFI_GET_PLATFORM_INFO_MODE enum.
551   @param  Alignment             Mode specific.  See EFI_GET_PLATFORM_INFO_MODE enum.
552   @param  LegacySegment         Mode specific.  See EFI_GET_PLATFORM_INFO_MODE enum.
553   @param  LegacyOffset          Mode specific.  See EFI_GET_PLATFORM_INFO_MODE enum.
554 
555   @retval EFI_SUCCESS           Data returned successfully.
556   @retval EFI_UNSUPPORTED       Mode is not supported on the platform.
557   @retval EFI_NOT_FOUND         Binary image or table not found.
558 
559 **/
560 typedef
561 EFI_STATUS
562 (EFIAPI *EFI_LEGACY_BIOS_PLATFORM_GET_PLATFORM_INFO)(
563   IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL   *This,
564   IN EFI_GET_PLATFORM_INFO_MODE          Mode,
565   OUT VOID                               **Table,
566   OUT UINTN                              *TableSize,
567   OUT UINTN                              *Location,
568   OUT UINTN                              *Alignment,
569   IN  UINT16                             LegacySegment,
570   IN  UINT16                             LegacyOffset
571   );
572 
573 /**
574   Returns a buffer of handles for the requested subfunction.
575 
576   @param  This                  The protocol instance pointer.
577   @param  Mode                  Specifies what handle to return. See EFI_GET_PLATFORM_HANDLE_MODE enum.
578   @param  Type                  Mode specific. See EFI_GET_PLATFORM_HANDLE_MODE enum.
579   @param  HandleBuffer          Mode specific. See EFI_GET_PLATFORM_HANDLE_MODE enum.
580   @param  HandleCount           Mode specific. See EFI_GET_PLATFORM_HANDLE_MODE enum.
581   @param  AdditionalData        Mode specific. See EFI_GET_PLATFORM_HANDLE_MODE enum.
582 
583   @retval EFI_SUCCESS           Handle is valid.
584   @retval EFI_UNSUPPORTED       Mode is not supported on the platform.
585   @retval EFI_NOT_FOUND         Handle is not known.
586 
587 **/
588 typedef
589 EFI_STATUS
590 (EFIAPI *EFI_LEGACY_BIOS_PLATFORM_GET_PLATFORM_HANDLE)(
591   IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL   *This,
592   IN EFI_GET_PLATFORM_HANDLE_MODE        Mode,
593   IN UINT16                              Type,
594   OUT EFI_HANDLE                         **HandleBuffer,
595   OUT UINTN                              *HandleCount,
596   IN  VOID                               **AdditionalData OPTIONAL
597   );
598 
599 /**
600   Load and initialize the Legacy BIOS SMM handler.
601 
602   @param  This                   The protocol instance pointer.
603   @param  EfiToLegacy16BootTable A pointer to Legacy16 boot table.
604 
605   @retval EFI_SUCCESS           SMM code loaded.
606   @retval EFI_DEVICE_ERROR      SMM code failed to load
607 
608 **/
609 typedef
610 EFI_STATUS
611 (EFIAPI *EFI_LEGACY_BIOS_PLATFORM_SMM_INIT)(
612   IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL   *This,
613   IN  VOID                               *EfiToLegacy16BootTable
614   );
615 
616 /**
617   Allows platform to perform any required action after a LegacyBios operation.
618   Invokes the specific sub function specified by Mode.
619 
620   @param  This                  The protocol instance pointer.
621   @param  Mode                  Specifies what handle to return. See EFI_GET_PLATFORM_HOOK_MODE enum.
622   @param  Type                  Mode specific.  See EFI_GET_PLATFORM_HOOK_MODE enum.
623   @param  DeviceHandle          Mode specific.  See EFI_GET_PLATFORM_HOOK_MODE enum.
624   @param  ShadowAddress         Mode specific.  See EFI_GET_PLATFORM_HOOK_MODE enum.
625   @param  Compatibility16Table  Mode specific.  See EFI_GET_PLATFORM_HOOK_MODE enum.
626   @param  AdditionalData        Mode specific.  See EFI_GET_PLATFORM_HOOK_MODE enum.
627 
628   @retval EFI_SUCCESS           The operation performed successfully. Mode specific.
629   @retval EFI_UNSUPPORTED       Mode is not supported on the platform.
630 
631 **/
632 typedef
633 EFI_STATUS
634 (EFIAPI *EFI_LEGACY_BIOS_PLATFORM_HOOKS)(
635   IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL   *This,
636   IN EFI_GET_PLATFORM_HOOK_MODE          Mode,
637   IN UINT16                              Type,
638   IN  EFI_HANDLE                         DeviceHandle, OPTIONAL
639   IN  OUT UINTN                          *ShadowAddress, OPTIONAL
640   IN  EFI_COMPATIBILITY16_TABLE          *Compatibility16Table, OPTIONAL
641   OUT  VOID                               **AdditionalData OPTIONAL
642   );
643 
644 /**
645   Returns information associated with PCI IRQ routing.
646   This function returns the following information associated with PCI IRQ routing:
647     * An IRQ routing table and number of entries in the table.
648     * The $PIR table and its size.
649     * A list of PCI IRQs and the priority order to assign them.
650 
651   @param  This                    The protocol instance pointer.
652   @param  RoutingTable            The pointer to PCI IRQ Routing table.
653                                   This location is the $PIR table minus the header.
654   @param  RoutingTableEntries     The number of entries in table.
655   @param  LocalPirqTable          $PIR table.
656   @param  PirqTableSize           $PIR table size.
657   @param  LocalIrqPriorityTable   A list of interrupts in priority order to assign.
658   @param  IrqPriorityTableEntries The number of entries in the priority table.
659 
660   @retval EFI_SUCCESS           Data was successfully returned.
661 
662 **/
663 typedef
664 EFI_STATUS
665 (EFIAPI *EFI_LEGACY_BIOS_PLATFORM_GET_ROUTING_TABLE)(
666   IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL   *This,
667   OUT VOID                               **RoutingTable,
668   OUT UINTN                              *RoutingTableEntries,
669   OUT VOID                               **LocalPirqTable, OPTIONAL
670   OUT UINTN                              *PirqTableSize, OPTIONAL
671   OUT VOID                               **LocalIrqPriorityTable, OPTIONAL
672   OUT UINTN                              *IrqPriorityTableEntries OPTIONAL
673   );
674 
675 /**
676   Translates the given PIRQ accounting for bridge.
677   This function translates the given PIRQ back through all buses, if required,
678   and returns the true PIRQ and associated IRQ.
679 
680   @param  This                  The protocol instance pointer.
681   @param  PciBus                The PCI bus number for this device.
682   @param  PciDevice             The PCI device number for this device.
683   @param  PciFunction           The PCI function number for this device.
684   @param  Pirq                  Input is PIRQ reported by device, and output is true PIRQ.
685   @param  PciIrq                The IRQ already assigned to the PIRQ, or the IRQ to be
686                                 assigned to the PIRQ.
687 
688   @retval EFI_SUCCESS           The PIRQ was translated.
689 
690 **/
691 typedef
692 EFI_STATUS
693 (EFIAPI *EFI_LEGACY_BIOS_PLATFORM_TRANSLATE_PIRQ)(
694   IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL   *This,
695   IN  UINTN                              PciBus,
696   IN  UINTN                              PciDevice,
697   IN  UINTN                              PciFunction,
698   IN  OUT UINT8                          *Pirq,
699   OUT UINT8                              *PciIrq
700   );
701 
702 /**
703   Attempt to legacy boot the BootOption. If the EFI contexted has been
704   compromised this function will not return.
705 
706   @param  This                   The protocol instance pointer.
707   @param  BbsDevicePath          The EFI Device Path from BootXXXX variable.
708   @param  BbsTable               The Internal BBS table.
709   @param  LoadOptionSize         The size of LoadOption in size.
710   @param  LoadOption             The LoadOption from BootXXXX variable
711   @param  EfiToLegacy16BootTable A pointer to BootTable structure
712 
713   @retval EFI_SUCCESS           Ready to boot.
714 
715 **/
716 typedef
717 EFI_STATUS
718 (EFIAPI *EFI_LEGACY_BIOS_PLATFORM_PREPARE_TO_BOOT)(
719   IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL   *This,
720   IN  BBS_BBS_DEVICE_PATH                *BbsDevicePath,
721   IN  VOID                               *BbsTable,
722   IN  UINT32                             LoadOptionsSize,
723   IN  VOID                               *LoadOptions,
724   IN  VOID                               *EfiToLegacy16BootTable
725   );
726 
727 /**
728   This protocol abstracts the platform portion of the traditional BIOS.
729 **/
730 struct _EFI_LEGACY_BIOS_PLATFORM_PROTOCOL {
731   ///
732   ///  Gets binary data or other platform information.
733   ///
734   EFI_LEGACY_BIOS_PLATFORM_GET_PLATFORM_INFO    GetPlatformInfo;
735   ///
736   ///  Returns a buffer of all handles matching the requested subfunction.
737   ///
738   EFI_LEGACY_BIOS_PLATFORM_GET_PLATFORM_HANDLE  GetPlatformHandle;
739   ///
740   ///  Loads and initializes the traditional BIOS SMM handler.
741   EFI_LEGACY_BIOS_PLATFORM_SMM_INIT             SmmInit;
742   ///
743   ///  Allows platform to perform any required actions after a LegacyBios operation.
744   ///
745   EFI_LEGACY_BIOS_PLATFORM_HOOKS                PlatformHooks;
746   ///
747   ///  Gets $PIR table.
748   EFI_LEGACY_BIOS_PLATFORM_GET_ROUTING_TABLE    GetRoutingTable;
749   ///
750   ///  Translates the given PIRQ to the final value after traversing any PCI bridges.
751   ///
752   EFI_LEGACY_BIOS_PLATFORM_TRANSLATE_PIRQ       TranslatePirq;
753   ///
754   ///  Final platform function before the system attempts to boot to a traditional OS.
755   ///
756   EFI_LEGACY_BIOS_PLATFORM_PREPARE_TO_BOOT      PrepareToBoot;
757 };
758 
759 extern EFI_GUID gEfiLegacyBiosPlatformProtocolGuid;
760 
761 #endif
762