hrev43769 adds 5 changesets to branch 'master' old head: c1cd48b72f6be4828edf9a25ed306f354e99dcd0 new head: 24dfcdc1950fac5f74340ebe11a05a06b433a6a5 ---------------------------------------------------------------------------- 962eb31: radeon_hd: Add better tracing 4ee41b2: radeon_hd: Disable spread spectrum * SS requires complex pll adjustments that we don't do atm c937ca1: radeon_hd: Improve pll DP bridge code * Only set DP bridge on DP bridge. * Add a bit of tracing 43b4a25: radeon_hd: The lack of a default case here was on purpose 24dfcdc: radeon_hd: AtomBIOS parser improvements * "DANGER" is a little strong of a warning * Provide better tracing when things go wrong * Give raw table / operation values in addition to AtomBIOS pointers [ Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- 6 files changed, 71 insertions(+), 18 deletions(-) src/add-ons/accelerants/radeon_hd/accelerant.cpp | 3 + .../accelerants/radeon_hd/atombios/atom.cpp | 33 +++++++++++----- src/add-ons/accelerants/radeon_hd/encoder.cpp | 1 + src/add-ons/accelerants/radeon_hd/gpu.cpp | 33 ++++++++++++++++ src/add-ons/accelerants/radeon_hd/gpu.h | 1 + src/add-ons/accelerants/radeon_hd/pll.cpp | 18 +++++---- ############################################################################ Commit: 962eb31b1cb88dea2f96bbbee412834e0e716775 URL: http://cgit.haiku-os.org/haiku/commit/?id=962eb31 Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Wed Feb 22 11:10:37 2012 UTC radeon_hd: Add better tracing ---------------------------------------------------------------------------- diff --git a/src/add-ons/accelerants/radeon_hd/encoder.cpp b/src/add-ons/accelerants/radeon_hd/encoder.cpp index df218c4..e8447f2 100644 --- a/src/add-ons/accelerants/radeon_hd/encoder.cpp +++ b/src/add-ons/accelerants/radeon_hd/encoder.cpp @@ -1476,6 +1476,10 @@ encoder_dpms_set(uint8 crtcID, int mode) else index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl); break; + default: + ERROR("%s: Unknown encoder object! (%" B_PRIu16 ")\n", + __func__, encoderID); + return; } switch (mode) { ############################################################################ Commit: 4ee41b26a00408835f410ee25b3241093c7f40d9 URL: http://cgit.haiku-os.org/haiku/commit/?id=4ee41b2 Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Wed Feb 22 12:31:53 2012 UTC radeon_hd: Disable spread spectrum * SS requires complex pll adjustments that we don't do atm ---------------------------------------------------------------------------- diff --git a/src/add-ons/accelerants/radeon_hd/accelerant.cpp b/src/add-ons/accelerants/radeon_hd/accelerant.cpp index 9fd4da4..a778475 100644 --- a/src/add-ons/accelerants/radeon_hd/accelerant.cpp +++ b/src/add-ons/accelerants/radeon_hd/accelerant.cpp @@ -263,6 +263,9 @@ radeon_init_accelerant(int device) radeon_init_bios(gInfo->rom); + // disable spread spectrum as it requires lots of extra calculations + radeon_gpu_ss_disable(); + // find GPIO pins from AtomBIOS gpio_probe(); diff --git a/src/add-ons/accelerants/radeon_hd/gpu.cpp b/src/add-ons/accelerants/radeon_hd/gpu.cpp index fa26593..3d3829e 100644 --- a/src/add-ons/accelerants/radeon_hd/gpu.cpp +++ b/src/add-ons/accelerants/radeon_hd/gpu.cpp @@ -524,3 +524,36 @@ radeon_gpu_irq_setup() return B_ERROR; } + + +status_t +radeon_gpu_ss_disable() +{ + TRACE("%s called\n", __func__); + + radeon_shared_info &info = *gInfo->shared_info; + uint32 ssControl; + + if (info.chipsetID >= RADEON_CEDAR) { + // PLL1 + ssControl = Read32(OUT, EVERGREEN_P1PLL_SS_CNTL); + ssControl &= ~EVERGREEN_PxPLL_SS_EN; + Write32(OUT, EVERGREEN_P1PLL_SS_CNTL, ssControl); + // PLL2 + ssControl = Read32(OUT, EVERGREEN_P2PLL_SS_CNTL); + ssControl &= ~EVERGREEN_PxPLL_SS_EN; + Write32(OUT, EVERGREEN_P2PLL_SS_CNTL, ssControl); + } else if (info.chipsetID >= RADEON_RS600) { + // PLL1 + ssControl = Read32(OUT, AVIVO_P1PLL_INT_SS_CNTL); + ssControl &= ~1; + Write32(OUT, AVIVO_P1PLL_INT_SS_CNTL, ssControl); + // PLL2 + ssControl = Read32(OUT, AVIVO_P2PLL_INT_SS_CNTL); + ssControl &= ~1; + Write32(OUT, AVIVO_P2PLL_INT_SS_CNTL, ssControl); + } else + return B_ERROR; + + return B_OK; +} diff --git a/src/add-ons/accelerants/radeon_hd/gpu.h b/src/add-ons/accelerants/radeon_hd/gpu.h index 6ca5087..324ba28 100644 --- a/src/add-ons/accelerants/radeon_hd/gpu.h +++ b/src/add-ons/accelerants/radeon_hd/gpu.h @@ -176,6 +176,7 @@ void radeon_gpu_mc_resume(struct gpu_state *gpuState); uint32 radeon_gpu_mc_idlecheck(); status_t radeon_gpu_mc_setup(); status_t radeon_gpu_irq_setup(); +status_t radeon_gpu_ss_disable(); #endif ############################################################################ Commit: c937ca1987565eae3496d16b3e8b1580c5f550a5 URL: http://cgit.haiku-os.org/haiku/commit/?id=c937ca1 Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Wed Feb 22 12:52:51 2012 UTC radeon_hd: Improve pll DP bridge code * Only set DP bridge on DP bridge. * Add a bit of tracing ---------------------------------------------------------------------------- diff --git a/src/add-ons/accelerants/radeon_hd/pll.cpp b/src/add-ons/accelerants/radeon_hd/pll.cpp index 075c0ba..b63efa1 100644 --- a/src/add-ons/accelerants/radeon_hd/pll.cpp +++ b/src/add-ons/accelerants/radeon_hd/pll.cpp @@ -50,6 +50,9 @@ pll_limit_probe(pll_info* pll) return B_ERROR; } + TRACE("%s: table %" B_PRIu8 ".%" B_PRIu8 "\n", __func__, + tableMajor, tableMinor); + union atomFirmwareInfo { ATOM_FIRMWARE_INFO info; ATOM_FIRMWARE_INFO_V1_2 info_12; @@ -342,14 +345,7 @@ pll_adjust(pll_info* pll, uint8 crtcID) uint32 encoderID = gConnector[connectorIndex]->encoder.objectID; uint32 encoderMode = display_get_encoder_mode(connectorIndex); uint32 encoderFlags = gConnector[connectorIndex]->encoder.flags; - bool dpBridge = false; - - if ((encoderFlags & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) - || gConnector[connectorIndex]->encoder.isDPBridge) { - TRACE("%s: external DP bridge detected!\n", __func__); - dpBridge = true; - } - + bool dpBridge = gConnector[connectorIndex]->encoder.isDPBridge; if (info.dceMajor >= 3) { @@ -362,6 +358,9 @@ pll_adjust(pll_info* pll, uint8 crtcID) return B_ERROR; } + TRACE("%s: table %" B_PRIu8 ".%" B_PRIu8 "\n", __func__, + tableMajor, tableMinor); + // Prepare arguments for AtomBIOS call union adjustPixelClock { ADJUST_DISPLAY_PLL_PS_ALLOCATION v1; @@ -500,6 +499,9 @@ pll_set(uint8 pllID, uint32 pixelClock, uint8 crtcID) int index = GetIndexIntoMasterTable(COMMAND, SetPixelClock); atom_parse_cmd_header(gAtomContext, index, &tableMajor, &tableMinor); + TRACE("%s: table %" B_PRIu8 ".%" B_PRIu8 "\n", __func__, + tableMajor, tableMinor); + uint32 bitsPerColor = 8; // TODO: Digital Depth, EDID 1.4+ on digital displays // isn't in Haiku edid common code? ############################################################################ Commit: 43b4a25fe4354104a35e578caf56dee187b813bd URL: http://cgit.haiku-os.org/haiku/commit/?id=43b4a25 Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Wed Feb 22 13:50:21 2012 UTC radeon_hd: The lack of a default case here was on purpose ---------------------------------------------------------------------------- diff --git a/src/add-ons/accelerants/radeon_hd/encoder.cpp b/src/add-ons/accelerants/radeon_hd/encoder.cpp index e8447f2..0a88ca7 100644 --- a/src/add-ons/accelerants/radeon_hd/encoder.cpp +++ b/src/add-ons/accelerants/radeon_hd/encoder.cpp @@ -1476,10 +1476,7 @@ encoder_dpms_set(uint8 crtcID, int mode) else index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl); break; - default: - ERROR("%s: Unknown encoder object! (%" B_PRIu16 ")\n", - __func__, encoderID); - return; + // default, none on purpose } switch (mode) { ############################################################################ Revision: hrev43769 Commit: 24dfcdc1950fac5f74340ebe11a05a06b433a6a5 URL: http://cgit.haiku-os.org/haiku/commit/?id=24dfcdc Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Wed Feb 22 15:35:15 2012 UTC radeon_hd: AtomBIOS parser improvements * "DANGER" is a little strong of a warning * Provide better tracing when things go wrong * Give raw table / operation values in addition to AtomBIOS pointers ---------------------------------------------------------------------------- diff --git a/src/add-ons/accelerants/radeon_hd/atombios/atom.cpp b/src/add-ons/accelerants/radeon_hd/atombios/atom.cpp index 6df03d2..3d71400 100644 --- a/src/add-ons/accelerants/radeon_hd/atombios/atom.cpp +++ b/src/add-ons/accelerants/radeon_hd/atombios/atom.cpp @@ -661,9 +661,8 @@ atom_op_jump(atom_exec_context *ctx, int *ptr, int arg) if (execute) { if (ctx->last_jump == (ctx->start + target)) { if (ctx->last_jump_count > ATOM_OP_JMP_TIMEOUT) { - ERROR("%s: DANGER! AtomBIOS stuck in loop" - " for more then %d jumps... abort!\n", - __func__, ATOM_OP_JMP_TIMEOUT); + ERROR("%s: Error: AtomBIOS stuck in loop for more then %d" + " jumps... abort!\n", __func__, ATOM_OP_JMP_TIMEOUT); ctx->abort = true; } else { ctx->last_jump_count++; @@ -1160,15 +1159,19 @@ atom_execute_table_locked(atom_context *ctx, int index, uint32 * params) debug_depth++; while (1) { op = CU8(ptr++); - if (op < ATOM_OP_NAMES_CNT) { - TRACE("%s: %s (0x%" B_PRIX16 ")\n", __func__, - atom_op_names[op], ptr - 1); - } else - TRACE("%s: unknown (0x%" B_PRIX16 ")\n", __func__, ptr - 1); + const char* operationName; + + if (op < ATOM_OP_NAMES_CNT) + operationName = atom_op_names[op]; + else + operationName = "UNKNOWN"; + + TRACE("%s: %s @ 0x%" B_PRIX16 "\n", __func__, operationName, ptr - 1); if (ectx.abort == true) { - ERROR("AtomBios parser was aborted executing (0x%" B_PRIX16 ")\n", - ptr - 1); + ERROR("%s: AtomBIOS parser aborted calling operation %s" + " (0x%" B_PRIX8 ") @ 0x%" B_PRIX16 "\n", __func__, + operationName, op, ptr - 1); free(ectx.ws); return B_ERROR; } @@ -1203,6 +1206,16 @@ atom_execute_table(atom_context *ctx, int index, uint32 *params) /* reset io mode */ ctx->io_mode = ATOM_IO_MM; status_t result = atom_execute_table_locked(ctx, index, params); + if (result != B_OK) { + const char* tableName; + if (index < ATOM_TABLE_NAMES_CNT) + tableName = atom_table_names[index]; + else + tableName = "Unknown"; + + ERROR("%s: AtomBIOS parser was aborted in table %s (0x%" B_PRIX8 ")\n", + __func__, tableName, index); + } release_sem(ctx->exec_sem); return result;