/** @file
  EFI ISA ACPI Protocol is used to enumerate and manage all the ISA controllers on
  the platform's ISA Bus.

Copyright (c) 2006 - 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.

**/

#ifndef __ISA_ACPI_H_
#define __ISA_ACPI_H_

///
/// Global ID for the EFI ISA ACPI Protocol.
///
#define EFI_ISA_ACPI_PROTOCOL_GUID \
  { \
    0x64a892dc, 0x5561, 0x4536, { 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 } \
  }

///
/// Forward declaration fo the EFI ISA ACPI Protocol
///
typedef struct _EFI_ISA_ACPI_PROTOCOL EFI_ISA_ACPI_PROTOCOL;

///
/// ISA ACPI Protocol interrupt resource attributes.
///
#define EFI_ISA_ACPI_IRQ_TYPE_HIGH_TRUE_EDGE_SENSITIVE   0x01   ///< Edge triggered interrupt on a rising edge.
#define EFI_ISA_ACPI_IRQ_TYPE_LOW_TRUE_EDGE_SENSITIVE    0x02   ///< Edge triggered interrupt on a falling edge.
#define EFI_ISA_ACPI_IRQ_TYPE_HIGH_TRUE_LEVEL_SENSITIVE  0x04   ///< Level sensitive interrupt active high.
#define EFI_ISA_ACPI_IRQ_TYPE_LOW_TRUE_LEVEL_SENSITIVE   0x08   ///< Level sensitive interrupt active low.

///
/// ISA ACPI Protocol DMA resource attributes.
///
#define EFI_ISA_ACPI_DMA_SPEED_TYPE_MASK                 0x03   ///< Bit mask of supported DMA speed attributes.
#define EFI_ISA_ACPI_DMA_SPEED_TYPE_COMPATIBILITY        0x00   ///< ISA controller supports compatibility mode DMA transfers.
#define EFI_ISA_ACPI_DMA_SPEED_TYPE_A                    0x01   ///< ISA controller supports type A DMA transfers.
#define EFI_ISA_ACPI_DMA_SPEED_TYPE_B                    0x02   ///< ISA controller supports type B DMA transfers.
#define EFI_ISA_ACPI_DMA_SPEED_TYPE_F                    0x03   ///< ISA controller supports type F DMA transfers.
#define EFI_ISA_ACPI_DMA_COUNT_BY_BYTE                   0x04   ///< ISA controller increments DMA address by bytes (8-bit).
#define EFI_ISA_ACPI_DMA_COUNT_BY_WORD                   0x08   ///< ISA controller increments DMA address by words (16-bit).
#define EFI_ISA_ACPI_DMA_BUS_MASTER                      0x10   ///< ISA controller is a DMA bus master.
#define EFI_ISA_ACPI_DMA_TRANSFER_TYPE_8_BIT             0x20   ///< ISA controller only supports 8-bit DMA transfers.
#define EFI_ISA_ACPI_DMA_TRANSFER_TYPE_8_BIT_AND_16_BIT  0x40   ///< ISA controller both 8-bit and 16-bit DMA transfers.
#define EFI_ISA_ACPI_DMA_TRANSFER_TYPE_16_BIT            0x80   ///< ISA controller only supports 16-bit DMA transfers.

///
/// ISA ACPI Protocol MMIO resource attributes
///
#define EFI_ISA_ACPI_MEMORY_WIDTH_MASK                   0x03   ///< Bit mask of supported ISA memory width attributes.
#define EFI_ISA_ACPI_MEMORY_WIDTH_8_BIT                  0x00   ///< ISA MMIO region only supports 8-bit access.
#define EFI_ISA_ACPI_MEMORY_WIDTH_16_BIT                 0x01   ///< ISA MMIO region only supports 16-bit access.
#define EFI_ISA_ACPI_MEMORY_WIDTH_8_BIT_AND_16_BIT       0x02   ///< ISA MMIO region supports both 8-bit and 16-bit access.
#define EFI_ISA_ACPI_MEMORY_WRITEABLE                    0x04   ///< ISA MMIO region supports write transactions.
#define EFI_ISA_ACPI_MEMORY_CACHEABLE                    0x08   ///< ISA MMIO region supports being cached.
#define EFI_ISA_ACPI_MEMORY_SHADOWABLE                   0x10   ///< ISA MMIO region may be shadowed.
#define EFI_ISA_ACPI_MEMORY_EXPANSION_ROM                0x20   ///< ISA MMIO region is an expansion ROM.

///
/// ISA ACPI Protocol I/O resource attributes
///
#define EFI_ISA_ACPI_IO_DECODE_10_BITS                   0x01    ///< ISA controllers uses a 10-bit address decoder for I/O cycles.
#define EFI_ISA_ACPI_IO_DECODE_16_BITS                   0x02    ///< ISA controllers uses a 16-bit address decoder for I/O cycles.

///
/// EFI ISA ACPI resource type
///
typedef enum {
  EfiIsaAcpiResourceEndOfList,    ///< Marks the end if a resource list.
  EfiIsaAcpiResourceIo,           ///< ISA I/O port resource range.
  EfiIsaAcpiResourceMemory,       ///< ISA MMIO resource range.
  EfiIsaAcpiResourceDma,          ///< ISA DMA resource.
  EfiIsaAcpiResourceInterrupt     ///< ISA interrupt resource.
} EFI_ISA_ACPI_RESOURCE_TYPE;

///
/// EFI ISA ACPI generic resource structure
///
typedef struct {
  EFI_ISA_ACPI_RESOURCE_TYPE  Type;         ///< The type of resource (I/O, MMIO, DMA, Interrupt).
  UINT32                      Attribute;    ///< Bit mask of attributes associated with this resource.  See EFI_ISA_ACPI_xxx macros for valid combinations.
  UINT32                      StartRange;   ///< The start of the resource range.
  UINT32                      EndRange;     ///< The end of the resource range.
} EFI_ISA_ACPI_RESOURCE;

///
/// EFI ISA ACPI resource device identifier
///
typedef struct {
  UINT32  HID;   ///< The ACPI Hardware Identifier value associated with an ISA controller.  Matchs ACPI DSDT contents.
  UINT32  UID;   ///< The ACPI Unique Identifier value associated with an ISA controller.  Matches ACPI DSDT contents.
} EFI_ISA_ACPI_DEVICE_ID;

///
/// EFI ISA ACPI resource list
///
typedef struct {
  EFI_ISA_ACPI_DEVICE_ID  Device;          ///< The ACPI HID/UID associated with an ISA controller.
  EFI_ISA_ACPI_RESOURCE   *ResourceItem;   ///< A pointer to the list of resources associated with an ISA controller.
} EFI_ISA_ACPI_RESOURCE_LIST;

/**
  Enumerates the ISA controllers on an ISA bus.

  This service allows all the ISA controllers on an ISA bus to be enumerated.  If
  Device is a pointer to a NULL value, then the first ISA controller on the ISA
  bus is returned in Device and EFI_SUCCESS is returned.  If Device is a pointer
  to a value that was returned on a prior call to DeviceEnumerate(), then the next
  ISA controller on the ISA bus is returned in Device and EFI_SUCCESS is returned.
  If Device is a pointer to the last ISA controller on the ISA bus, then
  EFI_NOT_FOUND is returned.

  @param[in]  This     The pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[out] Device   The pointer to an ISA controller named by ACPI HID/UID.

  @retval EFI_SUCCESS    The next ISA controller on the ISA bus was returned.
  @retval EFI_NOT_FOUND  No device found.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_ISA_ACPI_DEVICE_ENUMERATE)(
  IN  EFI_ISA_ACPI_PROTOCOL   *This,
  OUT EFI_ISA_ACPI_DEVICE_ID  **Device
  );

/**
  Sets the power state of an ISA controller.

  This services sets the power state of the ISA controller specified by Device to
  the power state specified by OnOff.  TRUE denotes on, FALSE denotes off.
  If the power state is sucessfully set on the ISA Controller, then
  EFI_SUCCESS is returned.

  @param[in] This     The pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[in] Device   The pointer to an ISA controller named by ACPI HID/UID.
  @param[in] OnOff    TRUE denotes on, FALSE denotes off.

  @retval EFI_SUCCESS   Successfully set the power state of the ISA controller.
  @retval Other         The ISA controller could not be placed in the requested power state.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_ISA_ACPI_SET_DEVICE_POWER)(
  IN EFI_ISA_ACPI_PROTOCOL   *This,
  IN EFI_ISA_ACPI_DEVICE_ID  *Device,
  IN BOOLEAN                 OnOff
  );

/**
  Retrieves the current set of resources associated with an ISA controller.

  Retrieves the set of I/O, MMIO, DMA, and interrupt resources currently
  assigned to the ISA controller specified by Device.  These resources
  are returned in ResourceList.

  @param[in]  This          The pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[in]  Device        The pointer to an ISA controller named by ACPI HID/UID.
  @param[out] ResourceList  The pointer to the current resource list for Device.

  @retval EFI_SUCCESS    Successfully retrieved the current resource list.
  @retval EFI_NOT_FOUND  The resource list could not be retrieved.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_ISA_ACPI_GET_CUR_RESOURCE)(
  IN  EFI_ISA_ACPI_PROTOCOL       *This,
  IN  EFI_ISA_ACPI_DEVICE_ID      *Device,
  OUT EFI_ISA_ACPI_RESOURCE_LIST  **ResourceList
  );

/**
  Retrieves the set of possible resources that may be assigned to an ISA controller
  with SetResource().

  Retrieves the possible sets of I/O, MMIO, DMA, and interrupt resources for the
  ISA controller specified by Device.  The sets are returned in ResourceList.

  @param[in]  This           The pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[in]  Device         The pointer to an ISA controller named by ACPI HID/UID.
  @param[out] ResourceList   The pointer to the returned list of resource lists.

  @retval EFI_UNSUPPORTED  This service is not supported.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_ISA_ACPI_GET_POS_RESOURCE)(
  IN EFI_ISA_ACPI_PROTOCOL        *This,
  IN EFI_ISA_ACPI_DEVICE_ID       *Device,
  OUT EFI_ISA_ACPI_RESOURCE_LIST  **ResourceList
  );

/**
  Assigns resources to an ISA controller.

  Assigns the I/O, MMIO, DMA, and interrupt resources specified by ResourceList
  to the ISA controller specified by Device.  ResourceList must match a resource list returned by GetPosResource() for the same ISA controller.

  @param[in] This           The pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[in] Device         The pointer to an ISA controller named by ACPI HID/UID.
  @param[in] ResourceList   The pointer to a resources list that must be one of the
                            resource lists returned by GetPosResource() for the
                            ISA controller specified by Device.

  @retval EFI_SUCCESS  Successfully set resources on the ISA controller.
  @retval Other        The resources could not be set for the ISA controller.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_ISA_ACPI_SET_RESOURCE)(
  IN EFI_ISA_ACPI_PROTOCOL       *This,
  IN EFI_ISA_ACPI_DEVICE_ID      *Device,
  IN EFI_ISA_ACPI_RESOURCE_LIST  *ResourceList
  );

/**
  Enables or disables an ISA controller.

  @param[in] This     The pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[in] Device   The pointer to the ISA controller to enable/disable.
  @param[in] Enable   TRUE to enable the ISA controller.  FALSE to disable the
                      ISA controller.

  @retval EFI_SUCCESS   Successfully enabled/disabled the ISA controller.
  @retval Other         The ISA controller could not be placed in the requested state.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_ISA_ACPI_ENABLE_DEVICE)(
  IN EFI_ISA_ACPI_PROTOCOL   *This,
  IN EFI_ISA_ACPI_DEVICE_ID  *Device,
  IN BOOLEAN                 Enable
  );

/**
  Initializes an ISA controller, so that it can be used.  This service must be called
  before SetResource(), EnableDevice(), or SetPower() will behave as expected.

  @param[in] This     The pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[in] Device   The pointer to an ISA controller named by ACPI HID/UID.

  @retval EFI_SUCCESS   Successfully initialized an ISA controller.
  @retval Other         The ISA controller could not be initialized.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_ISA_ACPI_INIT_DEVICE)(
  IN EFI_ISA_ACPI_PROTOCOL   *This,
  IN EFI_ISA_ACPI_DEVICE_ID  *Device
  );

/**
  Initializes all the HW states required for the ISA controllers on the ISA bus
  to be enumerated and managed by the rest of the services in this prorotol.
  This service must be called before any of the other services in this
  protocol will function as expected.

  @param[in] This  The pointer to the EFI_ISA_ACPI_PROTOCOL instance.

  @retval EFI_SUCCESS   Successfully initialized all required hardware states.
  @retval Other         The ISA interface could not be initialized.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_ISA_ACPI_INTERFACE_INIT)(
  IN EFI_ISA_ACPI_PROTOCOL  *This
  );

///
/// The EFI_ISA_ACPI_PROTOCOL provides the services to enumerate and manage
/// ISA controllers on an ISA bus.  These services include the ability to initialize,
/// enable, disable, and manage the power state of ISA controllers.  It also
/// includes services to query current resources, query possible resources,
/// and assign resources to an ISA controller.
///
struct _EFI_ISA_ACPI_PROTOCOL {
  EFI_ISA_ACPI_DEVICE_ENUMERATE  DeviceEnumerate;
  EFI_ISA_ACPI_SET_DEVICE_POWER  SetPower;
  EFI_ISA_ACPI_GET_CUR_RESOURCE  GetCurResource;
  EFI_ISA_ACPI_GET_POS_RESOURCE  GetPosResource;
  EFI_ISA_ACPI_SET_RESOURCE      SetResource;
  EFI_ISA_ACPI_ENABLE_DEVICE     EnableDevice;
  EFI_ISA_ACPI_INIT_DEVICE       InitDevice;
  EFI_ISA_ACPI_INTERFACE_INIT    InterfaceInit;
};

extern EFI_GUID gEfiIsaAcpiProtocolGuid;

#endif
