/** @file | |
This file declares PlatfromOpRom protocols that provide the interface between | |
the PCI bus driver/PCI Host Bridge Resource Allocation driver and a platform-specific | |
driver to describe the unique features of a platform. | |
This protocol is optional. | |
Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials are licensed and made available under | |
the terms and conditions of the BSD License that accompanies this distribution. | |
The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php. | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
@par Revision Reference: | |
This Protocol is defined in UEFI Platform Initialization Specification 1.2 | |
Volume 5: Standards | |
**/ | |
#ifndef _PCI_PLATFORM_H_ | |
#define _PCI_PLATFORM_H_ | |
/// | |
/// This file must be included because the EFI_PCI_PLATFORM_PROTOCOL uses | |
/// EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PHASE. | |
/// | |
#include <Protocol/PciHostBridgeResourceAllocation.h> | |
/// | |
/// Global ID for the EFI_PCI_PLATFORM_PROTOCOL. | |
/// | |
#define EFI_PCI_PLATFORM_PROTOCOL_GUID \ | |
{ \ | |
0x7d75280, 0x27d4, 0x4d69, {0x90, 0xd0, 0x56, 0x43, 0xe2, 0x38, 0xb3, 0x41} \ | |
} | |
/// | |
/// Forward declaration for EFI_PCI_PLATFORM_PROTOCOL. | |
/// | |
typedef struct _EFI_PCI_PLATFORM_PROTOCOL EFI_PCI_PLATFORM_PROTOCOL; | |
/// | |
/// EFI_PCI_PLATFORM_POLICY that is a bitmask with the following legal combinations: | |
/// - EFI_RESERVE_NONE_IO_ALIAS:<BR> | |
/// Does not set aside either ISA or VGA I/O resources during PCI | |
/// enumeration. By using this selection, the platform indicates that it does | |
/// not want to support a PCI device that requires ISA or legacy VGA | |
/// resources. If a PCI device driver asks for these resources, the request | |
/// will be turned down. | |
/// - EFI_RESERVE_ISA_IO_ALIAS | EFI_RESERVE_VGA_IO_ALIAS:<BR> | |
/// Sets aside the ISA I/O range and all the aliases during PCI | |
/// enumeration. VGA I/O ranges and aliases are included in ISA alias | |
/// ranges. In this scheme, seventy-five percent of the I/O space remains unused. | |
/// By using this selection, the platform indicates that it wants to support | |
/// PCI devices that require the following, at the cost of wasted I/O space: | |
/// ISA range and its aliases | |
/// Legacy VGA range and its aliases | |
/// The PCI bus driver will not allocate I/O addresses out of the ISA I/O | |
/// range and its aliases. The following are the ISA I/O ranges: | |
/// - n100..n3FF | |
/// - n500..n7FF | |
/// - n900..nBFF | |
/// - nD00..nFFF | |
/// | |
/// In this case, the PCI bus driver will ask the PCI host bridge driver for | |
/// larger I/O ranges. The PCI host bridge driver is not aware of the ISA | |
/// aliasing policy and merely attempts to allocate the requested ranges. | |
/// The first device that requests the legacy VGA range will get all the | |
/// legacy VGA range plus its aliased addresses forwarded to it. The first | |
/// device that requests the legacy ISA range will get all the legacy ISA | |
/// range, plus its aliased addresses, forwarded to it. | |
/// - EFI_RESERVE_ISA_IO_NO_ALIAS | EFI_RESERVE_VGA_IO_ALIAS:<BR> | |
/// Sets aside the ISA I/O range (0x100 - 0x3FF) during PCI enumeration | |
/// and the aliases of the VGA I/O ranges. By using this selection, the | |
/// platform indicates that it will support VGA devices that require VGA | |
/// ranges, including those that require VGA aliases. The platform further | |
/// wants to support non-VGA devices that ask for the ISA range (0x100 - | |
/// 3FF), but not if it also asks for the ISA aliases. The PCI bus driver will | |
/// not allocate I/O addresses out of the legacy ISA I/O range (0x100 - | |
/// 0x3FF) range or the aliases of the VGA I/O range. If a PCI device | |
/// driver asks for the ISA I/O ranges, including aliases, the request will be | |
/// turned down. The first device that requests the legacy VGA range will | |
/// get all the legacy VGA range plus its aliased addresses forwarded to | |
/// it. When the legacy VGA device asks for legacy VGA ranges and its | |
/// aliases, all the upstream PCI-to-PCI bridges must be set up to perform | |
/// 10-bit decode on legacy VGA ranges. To prevent two bridges from | |
/// positively decoding the same address, all PCI-to-PCI bridges that are | |
/// peers to this bridge will have to be set up to not decode ISA aliased | |
/// ranges. In that case, all the devices behind the peer bridges can | |
/// occupy only I/O addresses that are not ISA aliases. This is a limitation | |
/// of PCI-to-PCI bridges and is described in the white paper PCI-to-PCI | |
/// Bridges and Card Bus Controllers on Windows 2000, Windows XP, | |
/// and Windows Server 2003. The PCI enumeration process must be | |
/// cognizant of this restriction. | |
/// - EFI_RESERVE_ISA_IO_NO_ALIAS | EFI_RESERVE_VGA_IO_NO_ALIAS:<BR> | |
/// Sets aside the ISA I/O range (0x100 - 0x3FF) during PCI enumeration. | |
/// VGA I/O ranges are included in the ISA range. By using this selection, | |
/// the platform indicates that it wants to support PCI devices that require | |
/// the ISA range and legacy VGA range, but it does not want to support | |
/// devices that require ISA alias ranges or VGA alias ranges. The PCI | |
/// bus driver will not allocate I/O addresses out of the legacy ISA I/O | |
/// range (0x100-0x3FF). If a PCI device driver asks for the ISA I/O | |
/// ranges, including aliases, the request will be turned down. By using | |
/// this selection, the platform indicates that it will support VGA devices | |
/// that require VGA ranges, but it will not support VGA devices that | |
/// require VGA aliases. To truly support 16-bit VGA decode, all the PCIto- | |
/// PCI bridges that are upstream to a VGA device, as well as | |
/// upstream to the parent PCI root bridge, must support 16-bit VGA I/O | |
/// decode. See the PCI-to-PCI Bridge Architecture Specification for | |
/// information regarding the 16-bit VGA decode support. This | |
/// requirement must hold true for every VGA device in the system. If any | |
/// of these bridges does not support 16-bit VGA decode, it will positively | |
/// decode all the aliases of the VGA I/O ranges and this selection must | |
/// be treated like EFI_RESERVE_ISA_IO_NO_ALIAS | | |
/// EFI_RESERVE_VGA_IO_ALIAS. | |
/// | |
typedef UINT32 EFI_PCI_PLATFORM_POLICY; | |
/// | |
/// Does not set aside either ISA or VGA I/O resources during PCI | |
/// enumeration. | |
/// | |
#define EFI_RESERVE_NONE_IO_ALIAS 0x0000 | |
/// | |
/// Sets aside ISA I/O range and all aliases: | |
/// - n100..n3FF | |
/// - n500..n7FF | |
/// - n900..nBFF | |
/// - nD00..nFFF. | |
/// | |
#define EFI_RESERVE_ISA_IO_ALIAS 0x0001 | |
/// | |
/// Sets aside ISA I/O range 0x100-0x3FF. | |
/// | |
#define EFI_RESERVE_ISA_IO_NO_ALIAS 0x0002 | |
/// | |
/// Sets aside VGA I/O ranges and all aliases. | |
/// | |
#define EFI_RESERVE_VGA_IO_ALIAS 0x0004 | |
/// | |
/// Sets aside VGA I/O ranges | |
/// | |
#define EFI_RESERVE_VGA_IO_NO_ALIAS 0x0008 | |
/// | |
/// EFI_PCI_EXECUTION_PHASE is used to call a platform protocol and execute | |
/// platform-specific code. | |
/// | |
typedef enum { | |
/// | |
/// The phase that indicates the entry point to the PCI Bus Notify phase. This | |
/// platform hook is called before the PCI bus driver calls the | |
/// EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL driver. | |
/// | |
BeforePciHostBridge = 0, | |
/// | |
/// The phase that indicates the entry point to the PCI Bus Notify phase. This | |
/// platform hook is called before the PCI bus driver calls the | |
/// EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL driver. | |
/// | |
ChipsetEntry = 0, | |
/// | |
/// The phase that indicates the exit point to the Chipset Notify phase before | |
/// returning to the PCI Bus Driver Notify phase. This platform hook is called after | |
/// the PCI bus driver calls the EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL | |
/// driver. | |
/// | |
AfterPciHostBridge = 1, | |
/// | |
/// The phase that indicates the exit point to the Chipset Notify phase before | |
/// returning to the PCI Bus Driver Notify phase. This platform hook is called after | |
/// the PCI bus driver calls the EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL | |
/// driver. | |
/// | |
ChipsetExit = 1, | |
MaximumChipsetPhase | |
} EFI_PCI_EXECUTION_PHASE; | |
typedef EFI_PCI_EXECUTION_PHASE EFI_PCI_CHIPSET_EXECUTION_PHASE; | |
/** | |
The notification from the PCI bus enumerator to the platform that it is | |
about to enter a certain phase during the enumeration process. | |
The PlatformNotify() function can be used to notify the platform driver so that | |
it can perform platform-specific actions. No specific actions are required. | |
Eight notification points are defined at this time. More synchronization points | |
may be added as required in the future. The PCI bus driver calls the platform driver | |
twice for every Phase-once before the PCI Host Bridge Resource Allocation Protocol | |
driver is notified, and once after the PCI Host Bridge Resource Allocation Protocol | |
driver has been notified. | |
This member function may not perform any error checking on the input parameters. It | |
also does not return any error codes. If this member function detects any error condition, | |
it needs to handle those errors on its own because there is no way to surface any | |
errors to the caller. | |
@param[in] This The pointer to the EFI_PCI_PLATFORM_PROTOCOL instance. | |
@param[in] HostBridge The handle of the host bridge controller. | |
@param[in] Phase The phase of the PCI bus enumeration. | |
@param[in] ExecPhase Defines the execution phase of the PCI chipset driver. | |
@retval EFI_SUCCESS The function completed successfully. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_PCI_PLATFORM_PHASE_NOTIFY)( | |
IN EFI_PCI_PLATFORM_PROTOCOL *This, | |
IN EFI_HANDLE HostBridge, | |
IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PHASE Phase, | |
IN EFI_PCI_EXECUTION_PHASE ExecPhase | |
); | |
/** | |
The notification from the PCI bus enumerator to the platform for each PCI | |
controller at several predefined points during PCI controller initialization. | |
The PlatformPrepController() function can be used to notify the platform driver so that | |
it can perform platform-specific actions. No specific actions are required. | |
Several notification points are defined at this time. More synchronization points may be | |
added as required in the future. The PCI bus driver calls the platform driver twice for | |
every PCI controller-once before the PCI Host Bridge Resource Allocation Protocol driver | |
is notified, and once after the PCI Host Bridge Resource Allocation Protocol driver has | |
been notified. | |
This member function may not perform any error checking on the input parameters. It also | |
does not return any error codes. If this member function detects any error condition, it | |
needs to handle those errors on its own because there is no way to surface any errors to | |
the caller. | |
@param[in] This The pointer to the EFI_PCI_PLATFORM_PROTOCOL instance. | |
@param[in] HostBridge The associated PCI host bridge handle. | |
@param[in] RootBridge The associated PCI root bridge handle. | |
@param[in] PciAddress The address of the PCI device on the PCI bus. | |
@param[in] Phase The phase of the PCI controller enumeration. | |
@param[in] ExecPhase Defines the execution phase of the PCI chipset driver. | |
@retval EFI_SUCCESS The function completed successfully. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_PCI_PLATFORM_PREPROCESS_CONTROLLER)( | |
IN EFI_PCI_PLATFORM_PROTOCOL *This, | |
IN EFI_HANDLE HostBridge, | |
IN EFI_HANDLE RootBridge, | |
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS PciAddress, | |
IN EFI_PCI_CONTROLLER_RESOURCE_ALLOCATION_PHASE Phase, | |
IN EFI_PCI_EXECUTION_PHASE ExecPhase | |
); | |
/** | |
Retrieves the platform policy regarding enumeration. | |
The GetPlatformPolicy() function retrieves the platform policy regarding PCI | |
enumeration. The PCI bus driver and the PCI Host Bridge Resource Allocation Protocol | |
driver can call this member function to retrieve the policy. | |
@param[in] This The pointer to the EFI_PCI_PLATFORM_PROTOCOL instance. | |
@param[out] PciPolicy The platform policy with respect to VGA and ISA aliasing. | |
@retval EFI_SUCCESS The function completed successfully. | |
@retval EFI_INVALID_PARAMETER PciPolicy is NULL. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_PCI_PLATFORM_GET_PLATFORM_POLICY)( | |
IN CONST EFI_PCI_PLATFORM_PROTOCOL *This, | |
OUT EFI_PCI_PLATFORM_POLICY *PciPolicy | |
); | |
/** | |
Gets the PCI device's option ROM from a platform-specific location. | |
The GetPciRom() function gets the PCI device's option ROM from a platform-specific location. | |
The option ROM will be loaded into memory. This member function is used to return an image | |
that is packaged as a PCI 2.2 option ROM. The image may contain both legacy and EFI option | |
ROMs. See the UEFI 2.0 Specification for details. This member function can be used to return | |
option ROM images for embedded controllers. Option ROMs for embedded controllers are typically | |
stored in platform-specific storage, and this member function can retrieve it from that storage | |
and return it to the PCI bus driver. The PCI bus driver will call this member function before | |
scanning the ROM that is attached to any controller, which allows a platform to specify a ROM | |
image that is different from the ROM image on a PCI card. | |
@param[in] This The pointer to the EFI_PCI_PLATFORM_PROTOCOL instance. | |
@param[in] PciHandle The handle of the PCI device. | |
@param[out] RomImage If the call succeeds, the pointer to the pointer to the option ROM image. | |
Otherwise, this field is undefined. The memory for RomImage is allocated | |
by EFI_PCI_PLATFORM_PROTOCOL.GetPciRom() using the EFI Boot Service AllocatePool(). | |
It is the caller's responsibility to free the memory using the EFI Boot Service | |
FreePool(), when the caller is done with the option ROM. | |
@param[out] RomSize If the call succeeds, a pointer to the size of the option ROM size. Otherwise, | |
this field is undefined. | |
@retval EFI_SUCCESS The option ROM was available for this device and loaded into memory. | |
@retval EFI_NOT_FOUND No option ROM was available for this device. | |
@retval EFI_OUT_OF_RESOURCES No memory was available to load the option ROM. | |
@retval EFI_DEVICE_ERROR An error occurred in obtaining the option ROM. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_PCI_PLATFORM_GET_PCI_ROM)( | |
IN CONST EFI_PCI_PLATFORM_PROTOCOL *This, | |
IN EFI_HANDLE PciHandle, | |
OUT VOID **RomImage, | |
OUT UINTN *RomSize | |
); | |
/// | |
/// This protocol provides the interface between the PCI bus driver/PCI Host | |
/// Bridge Resource Allocation driver and a platform-specific driver to describe | |
/// the unique features of a platform. | |
/// | |
struct _EFI_PCI_PLATFORM_PROTOCOL { | |
/// | |
/// The notification from the PCI bus enumerator to the platform that it is about to | |
/// enter a certain phase during the enumeration process. | |
/// | |
EFI_PCI_PLATFORM_PHASE_NOTIFY PlatformNotify; | |
/// | |
/// The notification from the PCI bus enumerator to the platform for each PCI | |
/// controller at several predefined points during PCI controller initialization. | |
/// | |
EFI_PCI_PLATFORM_PREPROCESS_CONTROLLER PlatformPrepController; | |
/// | |
/// Retrieves the platform policy regarding enumeration. | |
/// | |
EFI_PCI_PLATFORM_GET_PLATFORM_POLICY GetPlatformPolicy; | |
/// | |
/// Gets the PCI device's option ROM from a platform-specific location. | |
/// | |
EFI_PCI_PLATFORM_GET_PCI_ROM GetPciRom; | |
}; | |
extern EFI_GUID gEfiPciPlatformProtocolGuid; | |
#endif |