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
This commit is contained in:
Alexander von Gluck IV 2012-03-01 07:11:28 -06:00
parent ccb23a1eee
commit 7dd182106a
3 changed files with 34 additions and 3 deletions

View File

@ -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();

View File

@ -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;

View File

@ -11,6 +11,7 @@
#include <SupportDefs.h>
void encoder_init();
void encoder_assign_crtc(uint8 crtcID);
uint32 encoder_pick_dig(uint32 connectorIndex);