/** @file PCH Smbus Protocol Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _PCH_SMBUS_COMMON_LIB_H #define _PCH_SMBUS_COMMON_LIB_H // // Definitions // #define STALL_PERIOD 10 * STALL_ONE_MICRO_SECOND ///< 10 microseconds #define STALL_TIME STALL_ONE_SECOND ///< 1 second #define BUS_TRIES 3 ///< How many times to retry on Bus Errors #define SMBUS_NUM_RESERVED 38 ///< Number of device addresses that are reserved by the SMBus spec. #define SMBUS_ADDRESS_ARP 0xC2 >> 1 #define SMBUS_DATA_PREPARE_TO_ARP 0x01 #define SMBUS_DATA_RESET_DEVICE 0x02 #define SMBUS_DATA_GET_UDID_GENERAL 0x03 #define SMBUS_DATA_ASSIGN_ADDRESS 0x04 #define SMBUS_GET_UDID_LENGTH 17 ///< 16 byte UDID + 1 byte address // // Private data and functions // typedef UINT8 (EFIAPI *SMBUS_IO_READ) ( IN UINT8 Offset ); typedef VOID (EFIAPI *SMBUS_IO_WRITE) ( IN UINT8 Offset, IN UINT8 Data ); typedef BOOLEAN (EFIAPI *SMBUS_IO_DONE) ( IN UINT8 *StsReg ); #define PCH_SMBUS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('p', 's', 'm', 'b') /** Get SMBUS IO Base address @retval UINT32 The SMBUS IO Base Address **/ UINT32 SmbusGetIoBase ( VOID ); /** This function provides a standard way to read PCH Smbus IO registers. @param[in] Offset Register offset from Smbus base IO address. @retval UINT8 Returns data read from IO. **/ UINT8 EFIAPI SmbusIoRead ( IN UINT8 Offset ); /** This function provides a standard way to write PCH Smbus IO registers. @param[in] Offset Register offset from Smbus base IO address. @param[in] Data Data to write to register. **/ VOID EFIAPI SmbusIoWrite ( IN UINT8 Offset, IN UINT8 Data ); /** This function provides a standard way to check if an SMBus transaction has completed. @param[in] StsReg Not used for input. On return, contains the value of the SMBus status register. @retval TRUE Transaction is complete @retval FALSE Otherwise. **/ BOOLEAN EFIAPI IoDone ( IN UINT8 *StsReg ); /** Check if it's ok to use the bus. @retval EFI_SUCCESS SmBus is acquired and it's safe to send commands. @retval EFI_TIMEOUT SmBus is busy, it's not safe to send commands. **/ EFI_STATUS AcquireBus ( VOID ); /** This function provides a standard way to execute Smbus protocols as defined in the SMBus Specification. The data can either be of the Length byte, word, or a block of data. The resulting transaction will be either the SMBus Slave Device accepts this transaction or this function returns with an error @param[in] SlaveAddress Smbus Slave device the command is directed at @param[in] Command Slave Device dependent @param[in] Operation Which SMBus protocol will be used @param[in] PecCheck Defines if Packet Error Code Checking is to be used @param[in, out] Length How many bytes to read. Must be 0 <= Length <= 32 depending on Operation It will contain the actual number of bytes read/written. @param[in, out] Buffer Contain the data read/written. @retval EFI_SUCCESS The operation completed successfully. @exception EFI_UNSUPPORTED The operation is unsupported. @retval EFI_INVALID_PARAMETER Length or Buffer is NULL for any operation besides quick read or quick write. @retval EFI_TIMEOUT The transaction did not complete within an internally specified timeout period, or the controller is not available for use. @retval EFI_DEVICE_ERROR There was an Smbus error (NACK) during the operation. This could indicate the slave device is not present or is in a hung condition. **/ EFI_STATUS SmbusExec ( 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 ); /** This function initializes the Smbus Registers. **/ VOID InitializeSmbusRegisters ( VOID ); #endif