/** @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__
