0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #ifndef __DAL_AUX_ENGINE_H__
0027 #define __DAL_AUX_ENGINE_H__
0028
0029 #include "dc_ddc_types.h"
0030 #include "include/i2caux_interface.h"
0031
0032 enum aux_return_code_type;
0033
0034 enum i2caux_transaction_operation {
0035 I2CAUX_TRANSACTION_READ,
0036 I2CAUX_TRANSACTION_WRITE
0037 };
0038
0039 enum i2caux_transaction_address_space {
0040 I2CAUX_TRANSACTION_ADDRESS_SPACE_I2C = 1,
0041 I2CAUX_TRANSACTION_ADDRESS_SPACE_DPCD
0042 };
0043
0044 struct i2caux_transaction_payload {
0045 enum i2caux_transaction_address_space address_space;
0046 uint32_t address;
0047 uint32_t length;
0048 uint8_t *data;
0049 };
0050
0051 enum i2caux_transaction_status {
0052 I2CAUX_TRANSACTION_STATUS_UNKNOWN = (-1L),
0053 I2CAUX_TRANSACTION_STATUS_SUCCEEDED,
0054 I2CAUX_TRANSACTION_STATUS_FAILED_CHANNEL_BUSY,
0055 I2CAUX_TRANSACTION_STATUS_FAILED_TIMEOUT,
0056 I2CAUX_TRANSACTION_STATUS_FAILED_PROTOCOL_ERROR,
0057 I2CAUX_TRANSACTION_STATUS_FAILED_NACK,
0058 I2CAUX_TRANSACTION_STATUS_FAILED_INCOMPLETE,
0059 I2CAUX_TRANSACTION_STATUS_FAILED_OPERATION,
0060 I2CAUX_TRANSACTION_STATUS_FAILED_INVALID_OPERATION,
0061 I2CAUX_TRANSACTION_STATUS_FAILED_BUFFER_OVERFLOW,
0062 I2CAUX_TRANSACTION_STATUS_FAILED_HPD_DISCON
0063 };
0064
0065 struct i2caux_transaction_request {
0066 enum i2caux_transaction_operation operation;
0067 struct i2caux_transaction_payload payload;
0068 enum i2caux_transaction_status status;
0069 };
0070
0071 enum i2caux_engine_type {
0072 I2CAUX_ENGINE_TYPE_UNKNOWN = (-1L),
0073 I2CAUX_ENGINE_TYPE_AUX,
0074 I2CAUX_ENGINE_TYPE_I2C_DDC_HW,
0075 I2CAUX_ENGINE_TYPE_I2C_GENERIC_HW,
0076 I2CAUX_ENGINE_TYPE_I2C_SW
0077 };
0078
0079 enum i2c_default_speed {
0080 I2CAUX_DEFAULT_I2C_HW_SPEED = 50,
0081 I2CAUX_DEFAULT_I2C_SW_SPEED = 50
0082 };
0083
0084 union aux_config;
0085
0086 struct aux_engine {
0087 uint32_t inst;
0088 struct ddc *ddc;
0089 struct dc_context *ctx;
0090 const struct aux_engine_funcs *funcs;
0091
0092 uint32_t delay;
0093 uint32_t max_defer_write_retry;
0094 bool acquire_reset;
0095 };
0096
0097 struct read_command_context {
0098 uint8_t *buffer;
0099 uint32_t current_read_length;
0100 uint32_t offset;
0101 enum i2caux_transaction_status status;
0102
0103 struct aux_request_transaction_data request;
0104 struct aux_reply_transaction_data reply;
0105
0106 uint8_t returned_byte;
0107
0108 uint32_t timed_out_retry_aux;
0109 uint32_t invalid_reply_retry_aux;
0110 uint32_t defer_retry_aux;
0111 uint32_t defer_retry_i2c;
0112 uint32_t invalid_reply_retry_aux_on_ack;
0113
0114 bool transaction_complete;
0115 bool operation_succeeded;
0116 };
0117
0118 struct write_command_context {
0119 bool mot;
0120
0121 uint8_t *buffer;
0122 uint32_t current_write_length;
0123 enum i2caux_transaction_status status;
0124
0125 struct aux_request_transaction_data request;
0126 struct aux_reply_transaction_data reply;
0127
0128 uint8_t returned_byte;
0129
0130 uint32_t timed_out_retry_aux;
0131 uint32_t invalid_reply_retry_aux;
0132 uint32_t defer_retry_aux;
0133 uint32_t defer_retry_i2c;
0134 uint32_t max_defer_retry;
0135 uint32_t ack_m_retry;
0136
0137 uint8_t reply_data[DEFAULT_AUX_MAX_DATA_SIZE];
0138
0139 bool transaction_complete;
0140 bool operation_succeeded;
0141 };
0142
0143
0144 struct aux_engine_funcs {
0145 bool (*configure_timeout)(
0146 struct ddc_service *ddc,
0147 uint32_t timeout);
0148 void (*destroy)(
0149 struct aux_engine **ptr);
0150 bool (*acquire_engine)(
0151 struct aux_engine *engine);
0152 void (*configure)(
0153 struct aux_engine *engine,
0154 union aux_config cfg);
0155 void (*submit_channel_request)(
0156 struct aux_engine *engine,
0157 struct aux_request_transaction_data *request);
0158 void (*process_channel_reply)(
0159 struct aux_engine *engine,
0160 struct aux_reply_transaction_data *reply);
0161 int (*read_channel_reply)(
0162 struct aux_engine *engine,
0163 uint32_t size,
0164 uint8_t *buffer,
0165 uint8_t *reply_result,
0166 uint32_t *sw_status);
0167 enum aux_return_code_type (*get_channel_status)(
0168 struct aux_engine *engine,
0169 uint8_t *returned_bytes);
0170 bool (*is_engine_available)(struct aux_engine *engine);
0171 enum i2caux_engine_type (*get_engine_type)(
0172 const struct aux_engine *engine);
0173 bool (*acquire)(
0174 struct aux_engine *engine,
0175 struct ddc *ddc);
0176 bool (*submit_request)(
0177 struct aux_engine *engine,
0178 struct i2caux_transaction_request *request,
0179 bool middle_of_transaction);
0180 void (*release_engine)(
0181 struct aux_engine *engine);
0182 void (*destroy_engine)(
0183 struct aux_engine **engine);
0184 };
0185 #endif