Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright 2012-15 Advanced Micro Devices, Inc.
0003  *
0004  * Permission is hereby granted, free of charge, to any person obtaining a
0005  * copy of this software and associated documentation files (the "Software"),
0006  * to deal in the Software without restriction, including without limitation
0007  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
0008  * and/or sell copies of the Software, and to permit persons to whom the
0009  * Software is furnished to do so, subject to the following conditions:
0010  *
0011  * The above copyright notice and this permission notice shall be included in
0012  * all copies or substantial portions of the Software.
0013  *
0014  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0015  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0016  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
0017  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
0018  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
0019  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0020  * OTHER DEALINGS IN THE SOFTWARE.
0021  *
0022  * Authors: AMD
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     /* following values are expressed in milliseconds */
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