From 80a0d0da5a8f9e1d3c068494e11cce9b0aa0799a Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Mon, 13 Jul 2015 22:58:05 -0500 Subject: [PATCH] radeon_hd: Fix missing subtraction of MOT in case. * DP i2c edid byte-bang working again --- .../accelerants/radeon_hd/displayport.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/add-ons/accelerants/radeon_hd/displayport.cpp b/src/add-ons/accelerants/radeon_hd/displayport.cpp index a24753fe25..f7c08676f2 100644 --- a/src/add-ons/accelerants/radeon_hd/displayport.cpp +++ b/src/add-ons/accelerants/radeon_hd/displayport.cpp @@ -149,17 +149,19 @@ dp_aux_transaction(uint32 connectorIndex, dp_aux_msg* message) uint8 transactionSize = 4; - switch(message->request) { + switch(message->request & ~DP_AUX_I2C_MOT) { case DP_AUX_NATIVE_WRITE: case DP_AUX_I2C_WRITE: - if (message->buffer == NULL) { - ERROR("%s: DP message uninitalized buffer!\n", __func__); - return B_ERROR; - } transactionSize += message->size; break; } + // If not bare address, check for buffer + if (message->size > 0 && message->buffer == NULL) { + ERROR("%s: DP message uninitalized buffer!\n", __func__); + return B_ERROR; + } + uint8 auxMessage[20]; auxMessage[0] = message->address & 0xff; auxMessage[1] = message->address >> 8; @@ -332,11 +334,13 @@ dp_aux_set_i2c_byte(uint32 connectorIndex, uint16 address, uint8* data, message.address = address; message.buffer = data; message.request = DP_AUX_I2C_WRITE; + message.size = 1; if (stop == false) message.request |= DP_AUX_I2C_MOT; - message.size = 1; - if (stop || start) + if (stop || start) { + message.buffer = NULL; message.size = 0; + } for (int attempt = 0; attempt < 7; attempt++) { status_t result = dp_aux_transaction(connectorIndex, &message); @@ -1010,6 +1014,7 @@ ddc2_dp_read_edid1(uint32 connectorIndex, edid1_info* edid) dp_aux_set_i2c_byte(connectorIndex, 0x50, &sdata, true, false); dp_aux_set_i2c_byte(connectorIndex, 0x50, &sdata, false, false); dp_aux_get_i2c_byte(connectorIndex, 0x50, rdata, true, false); + for (uint32 i = 0; i < sizeof(raw); i++) { status_t result = dp_aux_get_i2c_byte(connectorIndex, 0x50, rdata++, false, false);