/** @file
  EFI ISA ACPI Protocol is used to enumerate and manage all the ISA controllers on
  the platform's ISA Bus.

  Copyright (c) 2006 - 2009, Intel Corporation
  All rights reserved. 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.

**/

#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;   ///< 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     Pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[out] Device   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     Pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[in] Device   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 cound 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          Pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[in]  Device        Pointer to an ISA controller named by ACPI HID/UID.
  @param[out] ResourceList  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           Pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[in]  Device         Pointer to an ISA controller named by ACPI HID/UID.
  @param[out] ResourceList   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           Pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[in] Device         Pointer to an ISA controller named by ACPI HID/UID.
  @param[in] ResourceList   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     Pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[in] Device   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 cound 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     Pointer to the EFI_ISA_ACPI_PROTOCOL instance.
  @param[in] Device   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  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
