1 /* 2 * Copyright 2012-15 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * Authors: AMD 23 * 24 */ 25 #ifndef DC_DDC_TYPES_H_ 26 #define DC_DDC_TYPES_H_ 27 28 enum aux_transaction_type { 29 AUX_TRANSACTION_TYPE_DP, 30 AUX_TRANSACTION_TYPE_I2C 31 }; 32 33 34 enum i2caux_transaction_action { 35 I2CAUX_TRANSACTION_ACTION_I2C_WRITE = 0x00, 36 I2CAUX_TRANSACTION_ACTION_I2C_READ = 0x10, 37 I2CAUX_TRANSACTION_ACTION_I2C_STATUS_REQUEST = 0x20, 38 39 I2CAUX_TRANSACTION_ACTION_I2C_WRITE_MOT = 0x40, 40 I2CAUX_TRANSACTION_ACTION_I2C_READ_MOT = 0x50, 41 I2CAUX_TRANSACTION_ACTION_I2C_STATUS_REQUEST_MOT = 0x60, 42 43 I2CAUX_TRANSACTION_ACTION_DP_WRITE = 0x80, 44 I2CAUX_TRANSACTION_ACTION_DP_READ = 0x90 45 }; 46 47 enum aux_channel_operation_result { 48 AUX_CHANNEL_OPERATION_SUCCEEDED, 49 AUX_CHANNEL_OPERATION_FAILED_REASON_UNKNOWN, 50 AUX_CHANNEL_OPERATION_FAILED_INVALID_REPLY, 51 AUX_CHANNEL_OPERATION_FAILED_TIMEOUT, 52 AUX_CHANNEL_OPERATION_FAILED_HPD_DISCON, 53 AUX_CHANNEL_OPERATION_FAILED_ENGINE_ACQUIRE 54 }; 55 56 57 struct aux_request_transaction_data { 58 enum aux_transaction_type type; 59 enum i2caux_transaction_action action; 60 /* 20-bit AUX channel transaction address */ 61 uint32_t address; 62 /* delay, in 100-microsecond units */ 63 uint8_t delay; 64 uint32_t length; 65 uint8_t *data; 66 }; 67 68 enum aux_transaction_reply { 69 AUX_TRANSACTION_REPLY_AUX_ACK = 0x00, 70 AUX_TRANSACTION_REPLY_AUX_NACK = 0x01, 71 AUX_TRANSACTION_REPLY_AUX_DEFER = 0x02, 72 AUX_TRANSACTION_REPLY_I2C_OVER_AUX_NACK = 0x04, 73 AUX_TRANSACTION_REPLY_I2C_OVER_AUX_DEFER = 0x08, 74 75 AUX_TRANSACTION_REPLY_I2C_ACK = 0x00, 76 AUX_TRANSACTION_REPLY_I2C_NACK = 0x10, 77 AUX_TRANSACTION_REPLY_I2C_DEFER = 0x20, 78 79 AUX_TRANSACTION_REPLY_HPD_DISCON = 0x40, 80 81 AUX_TRANSACTION_REPLY_INVALID = 0xFF 82 }; 83 84 struct aux_reply_transaction_data { 85 enum aux_transaction_reply status; 86 uint32_t length; 87 uint8_t *data; 88 }; 89 90 struct i2c_payload { 91 bool write; 92 uint8_t address; 93 uint32_t length; 94 uint8_t *data; 95 }; 96 97 enum i2c_command_engine { 98 I2C_COMMAND_ENGINE_DEFAULT, 99 I2C_COMMAND_ENGINE_SW, 100 I2C_COMMAND_ENGINE_HW 101 }; 102 103 struct i2c_command { 104 struct i2c_payload *payloads; 105 uint8_t number_of_payloads; 106 107 enum i2c_command_engine engine; 108 109 /* expressed in KHz 110 * zero means "use default value" */ 111 uint32_t speed; 112 }; 113 114 struct gpio_ddc_hw_info { 115 bool hw_supported; 116 uint32_t ddc_channel; 117 }; 118 119 struct ddc { 120 struct gpio *pin_data; 121 struct gpio *pin_clock; 122 struct gpio_ddc_hw_info hw_info; 123 struct dc_context *ctx; 124 }; 125 126 union ddc_wa { 127 struct { 128 uint32_t DP_SKIP_POWER_OFF:1; 129 uint32_t DP_AUX_POWER_UP_WA_DELAY:1; 130 } bits; 131 uint32_t raw; 132 }; 133 134 struct ddc_flags { 135 uint8_t EDID_QUERY_DONE_ONCE:1; 136 uint8_t IS_INTERNAL_DISPLAY:1; 137 uint8_t FORCE_READ_REPEATED_START:1; 138 uint8_t EDID_STRESS_READ:1; 139 140 }; 141 142 enum ddc_transaction_type { 143 DDC_TRANSACTION_TYPE_NONE = 0, 144 DDC_TRANSACTION_TYPE_I2C, 145 DDC_TRANSACTION_TYPE_I2C_OVER_AUX, 146 DDC_TRANSACTION_TYPE_I2C_OVER_AUX_WITH_DEFER, 147 DDC_TRANSACTION_TYPE_I2C_OVER_AUX_RETRY_DEFER 148 }; 149 150 enum display_dongle_type { 151 DISPLAY_DONGLE_NONE = 0, 152 /* Active converter types*/ 153 DISPLAY_DONGLE_DP_VGA_CONVERTER, 154 DISPLAY_DONGLE_DP_DVI_CONVERTER, 155 DISPLAY_DONGLE_DP_HDMI_CONVERTER, 156 /* DP-HDMI/DVI passive dongles (Type 1 and Type 2)*/ 157 DISPLAY_DONGLE_DP_DVI_DONGLE, 158 DISPLAY_DONGLE_DP_HDMI_DONGLE, 159 /* Other types of dongle*/ 160 DISPLAY_DONGLE_DP_HDMI_MISMATCHED_DONGLE, 161 }; 162 163 struct ddc_service { 164 struct ddc *ddc_pin; 165 struct ddc_flags flags; 166 union ddc_wa wa; 167 enum ddc_transaction_type transaction_type; 168 enum display_dongle_type dongle_type; 169 struct dc_context *ctx; 170 struct dc_link *link; 171 172 uint32_t address; 173 uint32_t edid_buf_len; 174 uint8_t edid_buf[DC_MAX_EDID_BUFFER_SIZE]; 175 }; 176 177 #endif /* DC_DDC_TYPES_H_ */ 178