/** @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 - 2010, 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
