/** @file
  This PPI opens or closes an I/O aperture in a ISA HOST controller.

  Copyright (c) 2015 - 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
  which 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 PPI is from PI Version 1.2.1.

**/

#ifndef __ISA_HC_PPI_H__
#define __ISA_HC_PPI_H__

#define EFI_ISA_HC_PPI_GUID \
  { \
    0x8d48bd70, 0xc8a3, 0x4c06, {0x90, 0x1b, 0x74, 0x79, 0x46, 0xaa, 0xc3, 0x58} \
  }

typedef struct _EFI_ISA_HC_PPI EFI_ISA_HC_PPI;
typedef struct _EFI_ISA_HC_PPI *PEFI_ISA_HC_PPI;

/**
  Open I/O aperture.

  This function opens an I/O aperture in a ISA Host Controller for the I/O
  addresses specified by IoAddress to IoAddress + IoLength - 1. It is possible
  that more than one caller may be assigned to the same aperture.
  It may be possible that a single hardware aperture may be used for more than
  one device. This function tracks the number of times that each aperture is
  referenced, and doesa not close the hardware aperture (via CloseIoAperture())
  until there are no more references to it.

  @param This             A pointer to this instance of the EFI_ISA_HC_PPI.
  @param IoAddress        An unsigned integer that specifies the first byte of
                          the I/O space required.
  @param IoLength         An unsigned integer that specifies the number of
                          bytes of the I/O space required.
  @param IoApertureHandle A pointer to the returned I/O aperture handle.
                          This value can be used on subsequent calls to CloseIoAperture().

  @retval EFI_SUCCESS          The I/O aperture was opened successfully.
  @retval EFI_UNSUPPORTED      The ISA Host Controller is a subtractive-decode controller.
  @retval EFI_OUT_OF_RESOURCES There is no available I/O aperture.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_ISA_HC_OPEN_IO) (
  IN CONST EFI_ISA_HC_PPI   *This,
  IN UINT16                 IoAddress,
  IN UINT16                 IoLength,
  OUT UINT64                *IoApertureHandle
  );

/**
  Close I/O aperture.

  This function closes a previously opened I/O aperture handle. If there are no
  more I/O aperture handles that refer to the hardware I/O aperture resource,
  then the hardware I/O aperture is closed.
  It may be possible that a single hardware aperture may be used for more than
  one device. This function tracks the number of times that each aperture is
  referenced, and does not close the hardware aperture (via CloseIoAperture())
  until there are no more references to it.

  @param This             A pointer to this instance of the EFI_ISA_HC_PPI.
  @param IoApertureHandle The I/O aperture handle previously returned from a
                          call to OpenIoAperture().

  @retval EFI_SUCCESS   The I/O aperture was closed successfully.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_ISA_HC_CLOSE_IO) (
  IN CONST EFI_ISA_HC_PPI     *This,
  IN UINT64                   IoApertureHandle
  );

///
/// This PPI provides functions for opening or closing an I/O aperture.
///
struct _EFI_ISA_HC_PPI {
  ///
  /// An unsigned integer that specifies the version of the PPI structure.
  ///
  UINT32                  Version;
  ///
  /// The address of the ISA/LPC Bridge device.
  /// For PCI, this is the segment, bus, device and function of the a ISA/LPC
  /// Bridge device.
  ///
  /// If bits 24-31 are 0, then the definition is:
  /// Bits 0:2   - Function
  /// Bits 3-7   - Device
  /// Bits 8:15  - Bus
  /// Bits 16-23 - Segment
  /// Bits 24-31 - Bus Type
  /// If bits 24-31 are 0xff, then the definition is platform-specific.
  ///
  UINT32                  Address;
  ///
  /// Opens an aperture on a positive-decode ISA Host Controller.
  ///
  EFI_PEI_ISA_HC_OPEN_IO  OpenIoAperture;
  ///
  /// Closes an aperture on a positive-decode ISA Host Controller.
  ///
  EFI_PEI_ISA_HC_CLOSE_IO CloseIoAperture;
};

extern EFI_GUID gEfiIsaHcPpiGuid;

#endif
