0
0
mirror of https://github.com/edk2-porting/edk2-msm synced 2025-05-15 00:52:22 +00:00
Files
2022-10-13 21:54:35 +08:00

198 lines
5.6 KiB
C

#ifndef __EFII2C_H__
#define __EFII2C_H__
#include <Uefi.h>
#define QCOM_I2C_PROTOCOL_GUID \
{ \
0xb27ae8b1, 0x3e10, 0x4d07, \
{ \
0xab, 0x5c, 0xeb, 0x9a, 0x6d, 0xc6, 0xfa, 0x8f \
} \
}
#define I2C_FLAG_START 0x00000001
#define I2C_FLAG_STOP 0x00000002
#define I2C_FLAG_WRITE 0x00000004
#define I2C_FLAG_READ 0x00000008
#define I2C_FLAG_TIMESTAMP 0x00000010
#define I2C_STANDARD_MODE_FREQ_KHZ 100
#define I2C_FAST_MODE_FREQ_KHZ 400
#define I2C_FAST_MODE_PLUS_FREQ_KHZ 1000
#define I3C_SDR_DATA_RATE_12500_KHZ 12500
#define I3C_SDR_DATA_RATE_10000_KHZ 10000
#define I2C_WRITE_TRANSFER (I2C_FLAG_START | I2C_FLAG_WRITE | I2C_FLAG_STOP)
#define I2C_READ_TRANSFER (I2C_FLAG_START | I2C_FLAG_READ | I2C_FLAG_STOP)
#define I2C_WR_RD_WRITE (I2C_FLAG_START | I2C_FLAG_WRITE)
#define I2C_WR_RD_READ I2C_READ_TRANSFER
#define I2C_ADDRESS_QUERY (I2C_FLAG_START)
#define I2C_STOP_COMMAND (I2C_FLAG_STOP)
#define I2C_BUS_CLEAR 0
#define I2C_WR_RD_READ I2C_READ_TRANSFER
#define I2C_TRANSFER_MASK (I2C_FLAG_WRITE | I2C_FLAG_READ)
#define I2C_SUCCESS(x) (x == I2C_SUCCESS)
#define I2C_ERROR(x) (x != I2C_SUCCESS)
#define VALID_FLAGS(x) (\
((x & I2C_TRANSFER_MASK) == I2C_FLAG_READ) ||\
((x & I2C_TRANSFER_MASK) == I2C_FLAG_WRITE)\
)
typedef enum {
I2C_SUCCESS = 0,
I2C_ERROR_INVALID_PARAMETER,
I2C_ERROR_UNSUPPORTED_CORE_INSTANCE,
I2C_ERROR_API_INVALID_EXECUTION_LEVEL,
I2C_ERROR_API_NOT_SUPPORTED,
I2C_ERROR_API_ASYNC_MODE_NOT_SUPPORTED,
I2C_ERROR_API_PROTOCOL_MODE_NOT_SUPPORTED,
I2C_ERROR_HANDLE_ALLOCATION,
I2C_ERROR_HW_INFO_ALLOCATION,
I2C_ERROR_BUS_NOT_IDLE,
I2C_ERROR_TRANSFER_TIMEOUT,
I2C_ERROR_MEM_ALLOC_FAIL,
I2C_ERROR_INPUT_FIFO_OVER_RUN,
I2C_ERROR_OUTPUT_FIFO_UNDER_RUN,
I2C_ERROR_INPUT_FIFO_UNDER_RUN,
I2C_ERROR_OUTPUT_FIFO_OVER_RUN,
I2C_ERROR_COMMAND_OVER_RUN,
I2C_ERROR_COMMAND_ILLEGAL,
I2C_ERROR_COMMAND_FAIL,
I2C_ERROR_INVALID_CMD_OPCODE,
I2C_ERROR_START_STOP_UNEXPECTED,
I2C_ERROR_DATA_NACK,
I2C_ERROR_ADDR_NACK,
I2C_ERROR_ARBITRATION_LOST,
I2C_ERROR_PLATFORM_INIT_FAIL,
I2C_ERROR_PLATFORM_DEINIT_FAIL,
I2C_ERROR_PLATFORM_CRIT_SEC_FAIL,
I2C_ERROR_PLATFORM_SIGNAL_FAIL,
I2C_ERROR_PLATFORM_GET_CONFIG_FAIL,
I2C_ERROR_PLATFORM_GET_CLOCK_CONFIG_FAIL,
I2C_ERROR_PLATFORM_REG_INT_FAIL,
I2C_ERROR_PLATFORM_DE_REG_INT_FAIL,
I2C_ERROR_PLATFORM_CLOCK_ENABLE_FAIL,
I2C_ERROR_PLATFORM_GPIO_ENABLE_FAIL,
I2C_ERROR_PLATFORM_CLOCK_DISABLE_FAIL,
I2C_ERROR_PLATFORM_GPIO_DISABLE_FAIL,
I2C_TRANSFER_CANCELED,
I2C_TRANSFER_FORCE_TERMINATED,
I2C_TRANSFER_COMPLETED,
I2C_TRANSFER_INVALID,
I2C_ERROR_HANDLE_ALREADY_IN_QUEUE,
I2C_ERROR_DMA_REG_FAIL,
I2C_ERROR_DMA_EV_CHAN_ALLOC_FAIL,
I2C_ERROR_DMA_TX_CHAN_ALLOC_FAIL,
I2C_ERROR_DMA_RX_CHAN_ALLOC_FAIL,
I2C_ERROR_DMA_TX_CHAN_START_FAIL,
I2C_ERROR_DMA_RX_CHAN_START_FAIL,
I2C_ERROR_DMA_TX_CHAN_STOP_FAIL,
I2C_ERROR_DMA_RX_CHAN_STOP_FAIL,
I2C_ERROR_DMA_TX_CHAN_RESET_FAIL,
I2C_ERROR_DMA_RX_CHAN_RESET_FAIL,
I2C_ERROR_DMA_EV_CHAN_DE_ALLOC_FAIL,
I2C_ERROR_DMA_TX_CHAN_DE_ALLOC_FAIL,
I2C_ERROR_DMA_RX_CHAN_DE_ALLOC_FAIL,
I2C_ERROR_DMA_INSUFFICIENT_RESOURCES,
I2C_ERROR_DMA_PROCESS_TRANSFER_FAIL,
I2C_ERROR_DMA_EVT_OTHER,
I2C_ERROR_FW_LOAD_FALIURE,
I2C_ERROR_INVALID_FW_VERSION,
} I2C_STATUS;
typedef enum {
I2C = 0,
SMBUS,
I3C_SDR,
I3C_HDR_DDR,
I3C_BROADCAST_CCC,
I3C_DIRECT_CCC,
I3C_IBI_READ,
} I2C_MODE;
typedef struct {
UINT32 BusFrequency; // kHZ
UINT32 SlaveAddress;
I2C_MODE Mode;
UINT32 SlaveMaxClockStretch; // us
UINT32 CoreConfiguration1;
UINT32 CoreConfiguration2;
} I2C_SLAVE_CONFIG;
typedef struct {
UINT8 *Buffer;
UINT32 Length;
UINT32 Flags;
} I2C_DESCRIPTOR;
#define I2C_DXE_REVISION 0x0000000000010000
typedef struct _EFI_QCOM_I2C_PROTOCOL EFI_QCOM_I2C_PROTOCOL;
extern EFI_GUID gQcomI2CProtocolGuid;
typedef
VOID
(*I2C_CALLBACK) (
IN UINT32 TransferStatus,
IN UINT32 Transferred,
IN VOID *Context
);
typedef
I2C_STATUS
(EFIAPI *EFI_I2C_OPEN) (
IN UINT32 Instance,
OUT VOID **I2cHandle
);
typedef
I2C_STATUS
(EFIAPI *EFI_I2C_READ) (
IN VOID *I2cHandle,
IN I2C_SLAVE_CONFIG *Config,
IN UINT16 Offset,
IN UINT16 OffsetLength,
OUT UINT8 *Buffer,
IN UINT16 BufferLength,
OUT UINT32 *Read,
IN UINT32 Timeout // ms
);
typedef
I2C_STATUS
(EFIAPI *EFI_I2C_WRITE) (
IN VOID *I2cHandle,
IN I2C_SLAVE_CONFIG *Config,
IN UINT16 Offset,
IN UINT16 OffsetLength,
IN UINT8 *Buffer,
IN UINT16 BufferLength,
OUT UINT32 *Written,
IN UINT32 Timeout // ms
);
typedef
I2C_STATUS
(EFIAPI *EFI_I2C_TRANSFER) (
IN VOID *I2cHandle,
IN I2C_SLAVE_CONFIG *Config,
IN I2C_DESCRIPTOR *Descriptor,
IN UINT16 NumDescriptors,
IN I2C_CALLBACK Callback,
IN VOID *Context OPTIONAL,
IN UINT32 Delay, // us
OUT UINT32 *Transfered
);
typedef
I2C_STATUS
(EFIAPI *EFI_I2C_CLOSE) (
IN VOID *I2cHandle
);
struct _EFI_QCOM_I2C_PROTOCOL{
UINT64 Revision;
EFI_I2C_OPEN Open;
EFI_I2C_READ Read;
EFI_I2C_WRITE Write;
EFI_I2C_TRANSFER Transfer;
EFI_I2C_CLOSE Close;
};
#endif