/** @file
  The Super I/O Protocol is installed by the Super I/O driver. The Super I/O driver is a UEFI driver
  model compliant driver. In the Start() routine of the Super I/O driver, a handle with an instance
  of EFI_SIO_PROTOCOL is created for each device within the Super I/O. The device within the
  Super I/O is powered up, enabled, and assigned with the default set of resources. In the Stop()
  routine of the Super I/O driver, the device is disabled and Super I/O protocol is uninstalled.

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __EFI_SUPER_IO_PROTOCOL_H__
#define __EFI_SUPER_IO_PROTOCOL_H__
#include <IndustryStandard/Acpi.h>

#define EFI_SIO_PROTOCOL_GUID \
  { 0x215fdd18, 0xbd50, 0x4feb, { 0x89, 0xb, 0x58, 0xca, 0xb, 0x47, 0x39, 0xe9 } }

typedef union {
  ACPI_SMALL_RESOURCE_HEADER    *SmallHeader;
  ACPI_LARGE_RESOURCE_HEADER    *LargeHeader;
} ACPI_RESOURCE_HEADER_PTR;

typedef struct {
  UINT8    Register;    ///< Register number.
  UINT8    AndMask;     ///< Bitwise AND mask.
  UINT8    OrMask;      ///< Bitwise OR mask.
} EFI_SIO_REGISTER_MODIFY;

typedef struct _EFI_SIO_PROTOCOL EFI_SIO_PROTOCOL;

/**
  Provides a low level access to the registers for the Super I/O.

  @param[in]        This        Indicates a pointer to the calling context.
  @param[in]        Write       Specifies the type of the register operation. If this parameter is TRUE, Value is
                                interpreted as an input parameter and the operation is a register write. If this parameter
                                is FALSE, Value is interpreted as an output parameter and the operation is a register
                                read.
  @param[in]        ExitCfgMode Exit Configuration Mode Indicator. If this parameter is set to TRUE, the Super I/O
                                driver will turn off configuration mode of the Super I/O prior to returning from this
                                function. If this parameter is set to FALSE, the Super I/O driver will leave Super I/O
                                in the configuration mode.
                                The Super I/O driver must track the current state of the Super I/O and enable the
                                configuration mode of Super I/O if necessary prior to register access.
  @param[in]        Register    Register number.
  @param[in, out]   Value       If Write is TRUE, Value is a pointer to the buffer containing the byte of data to be
                                written to the Super I/O register. If Write is FALSE, Value is a pointer to the
                                destination buffer for the byte of data to be read from the Super I/O register.

  @retval EFI_SUCCESS           The operation completed successfully
  @retval EFI_INVALID_PARAMETER The Value is NULL
  @retval EFI_INVALID_PARAMETER Invalid Register number

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SIO_REGISTER_ACCESS)(
  IN   CONST  EFI_SIO_PROTOCOL  *This,
  IN          BOOLEAN           Write,
  IN          BOOLEAN           ExitCfgMode,
  IN          UINT8             Register,
  IN OUT      UINT8             *Value
  );

/**
  Provides an interface to get a list of the current resources consumed by the device in the ACPI
  Resource Descriptor format.

  GetResources() returns a list of resources currently consumed by the device. The
  ResourceList is a pointer to the buffer containing resource descriptors for the device. The
  descriptors are in the format of Small or Large ACPI resource descriptor as defined by ACPI
  specification (2.0 & 3.0). The buffer of resource descriptors is terminated with the 'End tag'
  resource descriptor.

  @param[in]    This            Indicates a pointer to the calling context.
  @param[out]   ResourceList    A pointer to an ACPI resource descriptor list that defines the current resources used by
                                the device. Type ACPI_RESOURCE_HEADER_PTR is defined in the "Related
                                Definitions" below.

  @retval EFI_SUCCESS           The operation completed successfully
  @retval EFI_INVALID_PARAMETER ResourceList is NULL

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SIO_GET_RESOURCES)(
  IN  CONST EFI_SIO_PROTOCOL            *This,
  OUT       ACPI_RESOURCE_HEADER_PTR    *ResourceList
  );

/**
  Sets the resources for the device.

  @param[in]  This          Indicates a pointer to the calling context.
  @param[in]  ResourceList  Pointer to the ACPI resource descriptor list. Type ACPI_RESOURCE_HEADER_PTR
                            is defined in the "Related Definitions" section of
                            EFI_SIO_PROTOCOL.GetResources().

  @retval EFI_SUCCESS           The operation completed successfully
  @retval EFI_INVALID_PARAMETER ResourceList is invalid
  @retval EFI_ACCESS_DENIED     Some of the resources in ResourceList are in use

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SIO_SET_RESOURCES)(
  IN CONST  EFI_SIO_PROTOCOL        *This,
  IN        ACPI_RESOURCE_HEADER_PTR ResourceList
  );

/**
  Provides a collection of resource descriptor lists. Each resource descriptor list in the collection
  defines a combination of resources that can potentially be used by the device.

  @param[in]  This                  Indicates a pointer to the calling context.
  @param[out] ResourceCollection    Collection of the resource descriptor lists.

  @retval EFI_SUCCESS               The operation completed successfully
  @retval EFI_INVALID_PARAMETER     ResourceCollection is NULL
**/
typedef
EFI_STATUS
(EFIAPI *EFI_SIO_POSSIBLE_RESOURCES)(
  IN  CONST EFI_SIO_PROTOCOL         *This,
  OUT       ACPI_RESOURCE_HEADER_PTR *ResourceCollection
  );

/**
  Provides an interface for a table based programming of the Super I/O registers.

  The Modify() function provides an interface for table based programming of the Super I/O
  registers. This function can be used to perform programming of multiple Super I/O registers with a
  single function call. For each table entry, the Register is read, its content is bitwise ANDed with
  AndMask, and then ORed with OrMask before being written back to the Register. The Super
  I/O driver must track the current state of the Super I/O and enable the configuration mode of Super I/
  O if necessary prior to table processing. Once the table is processed, the Super I/O device has to be
  returned to the original state.

  @param[in] This       Indicates a pointer to the calling context.
  @param[in] Command    A pointer to an array of NumberOfCommands EFI_SIO_REGISTER_MODIFY
                        structures. Each structure specifies a single Super I/O register modify operation. Type
                        EFI_SIO_REGISTER_MODIFY is defined in the "Related Definitions" below.
  @param[in] NumberOfCommands Number of elements in the Command array.

  @retval EFI_SUCCESS           The operation completed successfully
  @retval EFI_INVALID_PARAMETER Command is NULL

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SIO_MODIFY)(
  IN CONST EFI_SIO_PROTOCOL         *This,
  IN CONST EFI_SIO_REGISTER_MODIFY  *Command,
  IN       UINTN                    NumberOfCommands
  );

struct _EFI_SIO_PROTOCOL {
  EFI_SIO_REGISTER_ACCESS       RegisterAccess;
  EFI_SIO_GET_RESOURCES         GetResources;
  EFI_SIO_SET_RESOURCES         SetResources;
  EFI_SIO_POSSIBLE_RESOURCES    PossibleResources;
  EFI_SIO_MODIFY                Modify;
};

extern EFI_GUID  gEfiSioProtocolGuid;

#endif // __EFI_SUPER_IO_PROTOCOL_H__
