/** @file
  The Super I/O Control Protocol is installed by the Super I/O driver. It provides
  the low-level services for SIO devices that enable them to be used in the UEFI
  driver model.

  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 protocol is from PI Version 1.2.1.

**/

#ifndef __EFI_SUPER_IO_CONTROL_PROTOCOL_H__
#define __EFI_SUPER_IO_CONTROL_PROTOCOL_H__

#define EFI_SIO_CONTROL_PROTOCOL_GUID \
  { \
    0xb91978df, 0x9fc1, 0x427d, { 0xbb, 0x5, 0x4c, 0x82, 0x84, 0x55, 0xca, 0x27 } \
  }

typedef struct _EFI_SIO_CONTROL_PROTOCOL EFI_SIO_CONTROL_PROTOCOL;
typedef struct _EFI_SIO_CONTROL_PROTOCOL *PEFI_SIO_CONTROL_PROTOCOL;

/**
  Enable an ISA-style device.

  This function enables a logical ISA device and, if necessary, configures it
  to default settings, including memory, I/O, DMA and IRQ resources.

  @param This A pointer to this instance of the EFI_SIO_CONTROL_PROTOCOL.

  @retval EFI_SUCCESS          The device is enabled successfully.
  @retval EFI_OUT_OF_RESOURCES The device could not be enabled because there
                               were insufficient resources either for the device
                               itself or for the records needed to track the device.
  @retval EFI_ALREADY_STARTED  The device is already enabled.
  @retval EFI_UNSUPPORTED      The device cannot be enabled.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_SIO_CONTROL_ENABLE)(
  IN CONST EFI_SIO_CONTROL_PROTOCOL *This
  );

/**
  Disable a logical ISA device.

  This function disables a logical ISA device so that it no longer consumes
  system resources, such as memory, I/O, DMA and IRQ resources. Enough information
  must be available so that subsequent Enable() calls would properly reconfigure
  the device.

  @param This A pointer to this instance of the EFI_SIO_CONTROL_PROTOCOL.

  @retval EFI_SUCCESS          The device is disabled successfully.
  @retval EFI_OUT_OF_RESOURCES The device could not be disabled because there
                               were insufficient resources either for the device
                               itself or for the records needed to track the device.
  @retval EFI_ALREADY_STARTED  The device is already disabled.
  @retval EFI_UNSUPPORTED      The device cannot be disabled.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_SIO_CONTROL_DISABLE)(
  IN CONST EFI_SIO_CONTROL_PROTOCOL *This
  );

struct _EFI_SIO_CONTROL_PROTOCOL {
  ///
  /// The version of this protocol.
  ///
  UINT32                  Version;
  ///
  /// Enable a device.
  ///
  EFI_SIO_CONTROL_ENABLE  EnableDevice;
  ///
  /// Disable a device.
  ///
  EFI_SIO_CONTROL_DISABLE DisableDevice;
};

extern EFI_GUID gEfiSioControlProtocolGuid;

#endif // __EFI_SUPER_IO_CONTROL_PROTOCOL_H__
