From 7dd182106a9df09dd5804b47013a9232163881a3 Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Thu, 1 Mar 2012 07:11:28 -0600 Subject: [PATCH] radeon_hd: Fix invalid encoder state * This was a *big* oops on my part. * We were missing initial setup call for Kaleidoscope and DP Bridge encoders. * If you were having radeon HD mode setting issues, try this change. * Potential fix for #5722, #7397, #8059, #8151, #8282, #8289, #8310, #8322, #8331 --- .../accelerants/radeon_hd/accelerant.cpp | 3 ++ src/add-ons/accelerants/radeon_hd/encoder.cpp | 33 +++++++++++++++++-- src/add-ons/accelerants/radeon_hd/encoder.h | 1 + 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/add-ons/accelerants/radeon_hd/accelerant.cpp b/src/add-ons/accelerants/radeon_hd/accelerant.cpp index a77847517d..c2f937a6c9 100644 --- a/src/add-ons/accelerants/radeon_hd/accelerant.cpp +++ b/src/add-ons/accelerants/radeon_hd/accelerant.cpp @@ -285,6 +285,9 @@ radeon_init_accelerant(int device) // print found connectors debug_connectors(); + // setup encoders on each connector if needed + encoder_init(); + // setup link on any DisplayPort connectors dp_setup_connectors(); diff --git a/src/add-ons/accelerants/radeon_hd/encoder.cpp b/src/add-ons/accelerants/radeon_hd/encoder.cpp index 7598c45334..c80a5c32e8 100644 --- a/src/add-ons/accelerants/radeon_hd/encoder.cpp +++ b/src/add-ons/accelerants/radeon_hd/encoder.cpp @@ -34,6 +34,36 @@ extern "C" void _sPrintf(const char* format, ...); #define ERROR(x...) _sPrintf("radeon_hd: " x) +void +encoder_init() +{ + radeon_shared_info &info = *gInfo->shared_info; + + for (uint32 id = 0; id < ATOM_MAX_SUPPORTED_DEVICE; id++) { + if (gConnector[id]->valid == false) + continue; + + switch (gConnector[id]->encoder.objectID) { + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: + transmitter_dig_setup(id, 0, 0, 0, + ATOM_TRANSMITTER_ACTION_INIT); + break; + default: + break; + } + + if ((info.chipsetFlags & CHIP_APU) != 0 + && gConnector[id]->encoder.isExternal) { + encoder_external_setup(id, 0, + EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT); + } + } +} + + void encoder_assign_crtc(uint8 crtcID) { @@ -196,9 +226,6 @@ encoder_pick_dig(uint32 connectorIndex) break; } - TRACE("%s: Found crtc %" B_PRIu32 " for connector %" B_PRIu32 "\n", - __func__, crtcID, connectorIndex); - bool linkB = gConnector[connectorIndex]->encoder.linkEnumeration == GRAPH_OBJECT_ENUM_ID2 ? true : false; diff --git a/src/add-ons/accelerants/radeon_hd/encoder.h b/src/add-ons/accelerants/radeon_hd/encoder.h index d7c150eeeb..429d1c1f96 100644 --- a/src/add-ons/accelerants/radeon_hd/encoder.h +++ b/src/add-ons/accelerants/radeon_hd/encoder.h @@ -11,6 +11,7 @@ #include +void encoder_init(); void encoder_assign_crtc(uint8 crtcID); uint32 encoder_pick_dig(uint32 connectorIndex);