/** @file
  This file declares Smbus2 PPI.
  This PPI provides the basic I/O interfaces that a PEIM uses to access its
  SMBus controller and the slave devices attached to it.

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This PPI is introduced in PI Version 1.0.

**/

#ifndef __PEI_SMBUS2_PPI_H__
#define __PEI_SMBUS2_PPI_H__

#include <IndustryStandard/SmBus.h>

#define EFI_PEI_SMBUS2_PPI_GUID \
  { 0x9ca93627, 0xb65b, 0x4324, { 0xa2, 0x2, 0xc0, 0xb4, 0x61, 0x76, 0x45, 0x43 } }


typedef struct _EFI_PEI_SMBUS2_PPI EFI_PEI_SMBUS2_PPI;

/**
  Executes an SMBus operation to an SMBus controller. Returns when either
  the command has been executed or an error is encountered in doing the operation.

  @param  This            A pointer to the EFI_PEI_SMBUS2_PPI instance.
  @param  SlaveAddress    The SMBUS hardware address to which the SMBUS device is preassigned or
                          allocated.
  @param  Command         This command is transmitted by the SMBus host controller to the SMBus slave
                          device and the interpretation is SMBus slave device specific.
                          It can mean the offset to a list of functions inside
                          an SMBus slave device. Not all operations or slave devices support
                          this command's registers.
  @param  Operation       Signifies which particular SMBus hardware protocol instance that it
                          will use to execute the SMBus transactions.
                          This SMBus hardware protocol is defined by the System Management Bus (SMBus)
                          Specification and is not related to UEFI.
  @param  PecCheck        Defines if Packet Error Code (PEC) checking is required for this operation.
  @param  Length          Signifies the number of bytes that this operation will do.
                          The maximum number of bytes can be revision specific and operation specific.
                          This parameter will contain the actual number of bytes that are executed
                          for this operation. Not all operations require this argument.
  @param  Buffer          Contains the value of data to execute to the SMBus slave device.
                          Not all operations require this argument.
                          The length of this buffer is identified by Length.


  @retval EFI_SUCCESS           The last data that was returned from the access
                                matched the poll exit criteria.
  @retval EFI_CRC_ERROR         The checksum is not correct (PEC is incorrect)
  @retval EFI_TIMEOUT           Timeout expired before the operation was completed.
                                Timeout is determined by the SMBus host controller device.
  @retval EFI_OUT_OF_RESOURCES  The request could not be completed
                                due to a lack of resources.
  @retval EFI_DEVICE_ERROR      The request was not completed because
                                a failure reflected in the Host Status Register bit.
  @retval EFI_INVALID_PARAMETER Operation is not defined in EFI_SMBUS_OPERATION.
                                Or Length/Buffer is NULL for operations except for EfiSmbusQuickRead and
                                EfiSmbusQuickWrite. Or Length is outside the range of valid values.
  @retval EFI_UNSUPPORTED       The SMBus operation or PEC is not supported.
  @retval EFI_BUFFER_TOO_SMALL  Buffer is not sufficient for this operation.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_SMBUS2_PPI_EXECUTE_OPERATION)(
  IN CONST  EFI_PEI_SMBUS2_PPI        *This,
  IN        EFI_SMBUS_DEVICE_ADDRESS  SlaveAddress,
  IN        EFI_SMBUS_DEVICE_COMMAND  Command,
  IN        EFI_SMBUS_OPERATION       Operation,
  IN        BOOLEAN                   PecCheck,
  IN OUT    UINTN                     *Length,
  IN OUT    VOID                      *Buffer
);

/**
  The ArpDevice() function enumerates the entire bus or enumerates a specific
  device that is identified by SmbusUdid.

  @param  This           A pointer to the EFI_PEI_SMBUS2_PPI instance.
  @param  ArpAll         A Boolean expression that indicates if the host drivers need
                         to enumerate all the devices or enumerate only the device that is identified
                         by SmbusUdid. If ArpAll is TRUE, SmbusUdid and SlaveAddress are optional.
                         If ArpAll is FALSE, ArpDevice will enumerate SmbusUdid and the address
                         will be at SlaveAddress.
  @param  SmbusUdid      The targeted SMBus Unique Device Identifier (UDID).
                         The UDID may not exist for SMBus devices with fixed addresses.
  @param  SlaveAddress   The new SMBus address for the slave device for
                         which the operation is targeted.

  @retval EFI_SUCCESS           The SMBus slave device address was set.
  @retval EFI_INVALID_PARAMETER SlaveAddress is NULL.
  @retval EFI_OUT_OF_RESOURCES  The request could not be completed
                                due to a lack of resources.
  @retval EFI_TIMEOUT           The SMBus slave device did not respond.
  @retval EFI_DEVICE_ERROR      The request was not completed because the transaction failed.
  @retval EFI_UNSUPPORTED       ArpDevice, GetArpMap, and Notify are not implemented by this PEIM.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_SMBUS2_PPI_ARP_DEVICE)(
  IN CONST  EFI_PEI_SMBUS2_PPI        *This,
  IN        BOOLEAN                   ArpAll,
  IN        EFI_SMBUS_UDID            *SmbusUdid,   OPTIONAL
  IN OUT    EFI_SMBUS_DEVICE_ADDRESS  *SlaveAddress OPTIONAL
);

/**
  The GetArpMap() function returns the mapping of all the SMBus devices
  that are enumerated by the SMBus host driver.

  @param  This           A pointer to the EFI_PEI_SMBUS2_PPI instance.
  @param  Length         Size of the buffer that contains the SMBus device map.
  @param  SmbusDeviceMap The pointer to the device map as enumerated
                         by the SMBus controller driver.

  @retval EFI_SUCCESS           The device map was returned correctly in the buffer.
  @retval EFI_UNSUPPORTED       ArpDevice, GetArpMap, and Notify are not implemented by this PEIM.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_SMBUS2_PPI_GET_ARP_MAP)(
  IN CONST  EFI_PEI_SMBUS2_PPI    *This,
  IN OUT    UINTN                 *Length,
  IN OUT    EFI_SMBUS_DEVICE_MAP  **SmbusDeviceMap
);

/**
  CallBack function can be registered in EFI_PEI_SMBUS2_PPI_NOTIFY.

  @param  This           A pointer to the EFI_PEI_SMBUS2_PPI instance.
  @param  SlaveAddress   The SMBUS hardware address to which the SMBUS
                         device is preassigned or allocated.
  @param  Data           Data of the SMBus host notify command that
                         the caller wants to be called.

  @retval EFI_SUCCESS           NotifyFunction has been registered.
  @retval EFI_UNSUPPORTED       ArpDevice, GetArpMap, and Notify are not
                                implemented by this PEIM.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_SMBUS_NOTIFY2_FUNCTION)(
  IN CONST  EFI_PEI_SMBUS2_PPI        *SmbusPpi,
  IN        EFI_SMBUS_DEVICE_ADDRESS  SlaveAddress,
  IN        UINTN                     Data
);

/**
  The Notify() function registers all the callback functions to allow the
  bus driver to call these functions when the SlaveAddress/Data pair happens.

  @param  This           A pointer to the EFI_PEI_SMBUS2_PPI instance.
  @param  SlaveAddress   Address that the host controller detects as
                         sending a message and calls all the registered functions.
  @param  Data           Data that the host controller detects as sending a message
                         and calls all the registered functions.
  @param  NotifyFunction The function to call when the bus driver
                         detects the SlaveAddress and Data pair.

  @retval EFI_SUCCESS     NotifyFunction has been registered.
  @retval EFI_UNSUPPORTED ArpDevice, GetArpMap, and Notify are not
                          implemented by this PEIM.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_SMBUS2_PPI_NOTIFY)(
  IN CONST EFI_PEI_SMBUS2_PPI              *This,
  IN       EFI_SMBUS_DEVICE_ADDRESS        SlaveAddress,
  IN       UINTN                           Data,
  IN       EFI_PEI_SMBUS_NOTIFY2_FUNCTION  NotifyFunction
);

///
///  Provides the basic I/O interfaces that a PEIM uses to access
///  its SMBus controller and the slave devices attached to it.
///
struct _EFI_PEI_SMBUS2_PPI {
  EFI_PEI_SMBUS2_PPI_EXECUTE_OPERATION  Execute;
  EFI_PEI_SMBUS2_PPI_ARP_DEVICE         ArpDevice;
  EFI_PEI_SMBUS2_PPI_GET_ARP_MAP        GetArpMap;
  EFI_PEI_SMBUS2_PPI_NOTIFY             Notify;
  ///
  /// Identifier which uniquely identifies this SMBus controller in a system.
  ///
  EFI_GUID                              Identifier;
};

extern EFI_GUID gEfiPeiSmbus2PpiGuid;

#endif
