hrev43441 adds 1 changeset to branch 'master' old head: 309993503fdd40606cbb913bdddf149eedabb813 new head: 36de623307c7a714fd1b6960728c878f5eb78f81 ---------------------------------------------------------------------------- 36de623: Speak aux data via AtomBIOS call * add function to speak DP AUX data via AtomBIOS call * clean up connector index variable names [ Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev43441 Commit: 36de623307c7a714fd1b6960728c878f5eb78f81 URL: http://cgit.haiku-os.org/haiku/commit/?id=36de623 Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Thu Dec 8 23:01:40 2011 UTC ---------------------------------------------------------------------------- 3 files changed, 74 insertions(+), 11 deletions(-) src/add-ons/accelerants/radeon_hd/accelerant.h | 2 +- src/add-ons/accelerants/radeon_hd/connector.cpp | 81 ++++++++++++++++--- src/add-ons/accelerants/radeon_hd/connector.h | 2 + ---------------------------------------------------------------------------- diff --git a/src/add-ons/accelerants/radeon_hd/accelerant.h b/src/add-ons/accelerants/radeon_hd/accelerant.h index 72f026a..a8149a7 100644 --- a/src/add-ons/accelerants/radeon_hd/accelerant.h +++ b/src/add-ons/accelerants/radeon_hd/accelerant.h @@ -103,7 +103,7 @@ struct register_info { typedef struct { bool valid; - bool hw_capable; + bool hw_capable; // can do hw assisted i2c uint32 hw_line; uint32 mask_scl_reg; diff --git a/src/add-ons/accelerants/radeon_hd/connector.cpp b/src/add-ons/accelerants/radeon_hd/connector.cpp index 8e98403..68467f4 100644 --- a/src/add-ons/accelerants/radeon_hd/connector.cpp +++ b/src/add-ons/accelerants/radeon_hd/connector.cpp @@ -29,6 +29,67 @@ #define ERROR(x...) _sPrintf("radeon_hd: " x) +union aux_channel_transaction { + PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION v1; + PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS_V2 v2; +}; + + +int +dp_aux_speak(uint8 connectorIndex, uint8 *send, int sendBytes, + uint8 *recv, int recvBytes, uint8 delay, uint8 *ack) +{ + uint32 gpioID = gConnector[connectorIndex]->gpioID; + + if (gGPIOInfo[gpioID]->valid != true) { + ERROR("%s: cannot speak on invalid GPIO pin!\n", __func__); + return -B_IO_ERROR; + } + + union aux_channel_transaction args; + int index = GetIndexIntoMasterTable(COMMAND, ProcessAuxChannelTransaction); + + memset(&args, 0, sizeof(args)); + + unsigned char *base = (unsigned char *)gAtomContext->scratch; + memcpy(base, send, sendBytes); + + args.v1.lpAuxRequest = 0; + args.v1.lpDataOut = 16; + args.v1.ucDataOutLen = 0; + args.v1.ucChannelID = gGPIOInfo[gpioID]->hw_line; + args.v1.ucDelay = delay / 10; + + //if (ASIC_IS_DCE4(rdev)) + // args.v2.ucHPD_ID = chan->rec.hpd; + + atom_execute_table(gAtomContext, index, (uint32*)&args); + + *ack = args.v1.ucReplyStatus; + + switch(args.v1.ucReplyStatus) { + case 1: + ERROR("%s: dp_aux_ch timeout!\n", __func__); + return -B_TIMED_OUT; + case 2: + ERROR("%s: dp_aux_ch flags not zero!\n", __func__); + return -B_BUSY; + case 3: + ERROR("%s: dp_aux_ch error!\n", __func__); + return -B_IO_ERROR; + } + + int recvLength = args.v1.ucDataOutLen; + if (recvLength > recvBytes) + recvLength = recvBytes; + + if (recv && recvBytes) + memcpy(recv, base + 16, recvLength); + + return recvLength; +} + + static void gpio_lock_i2c(void* cookie, bool lock) { @@ -120,14 +181,14 @@ gpio_set_i2c_bit(void* cookie, int clock, int data) bool -connector_read_edid(uint32 connector, edid1_info *edid) +connector_read_edid(uint32 connectorIndex, edid1_info *edid) { // ensure things are sane - uint32 gpioID = gConnector[connector]->gpioID; + uint32 gpioID = gConnector[connectorIndex]->gpioID; if (gGPIOInfo[gpioID]->valid == false) return false; - if (gConnector[connector]->type == VIDEO_CONNECTOR_LVDS) { + if (gConnector[connectorIndex]->type == VIDEO_CONNECTOR_LVDS) { // we should call connector_read_edid_lvds at some point ERROR("%s: LCD panel detected (LVDS), sending VESA EDID!\n", __func__); @@ -150,7 +211,7 @@ connector_read_edid(uint32 connector, edid1_info *edid) return false; TRACE("%s: found edid monitor on connector #%" B_PRId32 "\n", - __func__, connector); + __func__, connectorIndex); return true; } @@ -158,7 +219,7 @@ connector_read_edid(uint32 connector, edid1_info *edid) #if 0 bool -connector_read_edid_lvds(uint32 connector, edid1_info *edid) +connector_read_edid_lvds(uint32 connectorIndex, edid1_info *edid) { uint8 dceMajor; uint8 dceMinor; @@ -226,18 +287,18 @@ connector_read_edid_lvds(uint32 connector, edid1_info *edid) status_t -connector_attach_gpio(uint32 id, uint8 hw_line) +connector_attach_gpio(uint32 connectorIndex, uint8 hwLine) { - gConnector[id]->gpioID = 0; + gConnector[connectorIndex]->gpioID = 0; for (uint32 i = 0; i < ATOM_MAX_SUPPORTED_DEVICE; i++) { - if (gGPIOInfo[i]->hw_line != hw_line) + if (gGPIOInfo[i]->hw_line != hwLine) continue; - gConnector[id]->gpioID = i; + gConnector[connectorIndex]->gpioID = i; return B_OK; } TRACE("%s: couldn't find GPIO for connector %" B_PRIu32 "\n", - __func__, id); + __func__, connectorIndex); return B_ERROR; } diff --git a/src/add-ons/accelerants/radeon_hd/connector.h b/src/add-ons/accelerants/radeon_hd/connector.h index 1d7b06c..28738af 100644 --- a/src/add-ons/accelerants/radeon_hd/connector.h +++ b/src/add-ons/accelerants/radeon_hd/connector.h @@ -58,6 +58,8 @@ const int connector_convert[] = { }; +int dp_aux_speak(uint8 connectorIndex, uint8 *send, int sendBytes, + uint8 *recv, int recvBytes, uint8 delay, uint8 *ack); status_t gpio_probe(); status_t connector_attach_gpio(uint32 id, uint8 hw_line); bool connector_read_edid(uint32 connector, edid1_info *edid);