radeon_hd: DIG encoder work
* Cleanup some AtomBIOS arg versions * Add tracing to encoder calls * Program a missing dig lane count
This commit is contained in:
@@ -37,6 +37,7 @@ extern "C" void _sPrintf(const char* format, ...);
|
|||||||
void
|
void
|
||||||
encoder_init()
|
encoder_init()
|
||||||
{
|
{
|
||||||
|
TRACE("%s: called\n", __func__);
|
||||||
radeon_shared_info &info = *gInfo->shared_info;
|
radeon_shared_info &info = *gInfo->shared_info;
|
||||||
|
|
||||||
for (uint32 id = 0; id < ATOM_MAX_SUPPORTED_DEVICE; id++) {
|
for (uint32 id = 0; id < ATOM_MAX_SUPPORTED_DEVICE; id++) {
|
||||||
@@ -79,6 +80,9 @@ encoder_assign_crtc(uint8 crtcID)
|
|||||||
!= B_OK)
|
!= B_OK)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
TRACE("%s: table %" B_PRIu8 ".%" B_PRIu8 "\n", __func__,
|
||||||
|
tableMajor, tableMinor);
|
||||||
|
|
||||||
uint16 connectorIndex = gDisplay[crtcID]->connectorIndex;
|
uint16 connectorIndex = gDisplay[crtcID]->connectorIndex;
|
||||||
uint16 encoderID = gConnector[connectorIndex]->encoder.objectID;
|
uint16 encoderID = gConnector[connectorIndex]->encoder.objectID;
|
||||||
uint16 encoderFlags = gConnector[connectorIndex]->encoder.flags;
|
uint16 encoderFlags = gConnector[connectorIndex]->encoder.flags;
|
||||||
@@ -577,17 +581,23 @@ encoder_dig_setup(uint32 connectorIndex, uint32 pixelClock, int command)
|
|||||||
bool linkB = connector->encoder.linkEnumeration
|
bool linkB = connector->encoder.linkEnumeration
|
||||||
== GRAPH_OBJECT_ENUM_ID2 ? true : false;
|
== GRAPH_OBJECT_ENUM_ID2 ? true : false;
|
||||||
|
|
||||||
// determine DP panel mode
|
uint32 panelMode = 0;
|
||||||
uint32 panelMode;
|
// determine DP panel mode if doing panel mode setup
|
||||||
if (info.dceMajor >= 4 && isDPBridge) {
|
if (command == ATOM_ENCODER_CMD_SETUP_PANEL_MODE) {
|
||||||
if (connector->encoderExternal.objectID == ENCODER_OBJECT_ID_NUTMEG)
|
if (info.dceMajor >= 4 && isDPBridge) {
|
||||||
panelMode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
|
if (connector->encoderExternal.objectID == ENCODER_OBJECT_ID_NUTMEG)
|
||||||
else {
|
panelMode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
|
||||||
// aka ENCODER_OBJECT_ID_TRAVIS or VIDEO_CONNECTOR_EDP
|
else if (connector->encoderExternal.objectID
|
||||||
panelMode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
|
== ENCODER_OBJECT_ID_TRAVIS) {
|
||||||
}
|
TRACE("%s: TODO: Travis: read DP confg data, DP1 vs DP2 mode\n",
|
||||||
} else
|
__func__);
|
||||||
panelMode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
|
panelMode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
|
||||||
|
} else {
|
||||||
|
panelMode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
panelMode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
uint32 encoderID = gConnector[connectorIndex]->encoder.objectID;
|
uint32 encoderID = gConnector[connectorIndex]->encoder.objectID;
|
||||||
@@ -606,6 +616,13 @@ encoder_dig_setup(uint32 connectorIndex, uint32 pixelClock, int command)
|
|||||||
if (dpInfo->valid == true)
|
if (dpInfo->valid == true)
|
||||||
dpClock = dpInfo->linkRate;
|
dpClock = dpInfo->linkRate;
|
||||||
|
|
||||||
|
bool dualLink = false;
|
||||||
|
if (connector->type == VIDEO_CONNECTOR_DVID
|
||||||
|
&& pixelClock > 165000) {
|
||||||
|
// TODO: Expand on this
|
||||||
|
dualLink = true;
|
||||||
|
}
|
||||||
|
|
||||||
switch (tableMinor) {
|
switch (tableMinor) {
|
||||||
case 1:
|
case 1:
|
||||||
args.v1.ucAction = command;
|
args.v1.ucAction = command;
|
||||||
@@ -618,6 +635,14 @@ encoder_dig_setup(uint32 connectorIndex, uint32 pixelClock, int command)
|
|||||||
= display_get_encoder_mode(connectorIndex);
|
= display_get_encoder_mode(connectorIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP
|
||||||
|
|| args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP_MST) {
|
||||||
|
args.v1.ucLaneNum = dpInfo->laneCount;
|
||||||
|
} else if (dualLink)
|
||||||
|
args.v1.ucLaneNum = 8;
|
||||||
|
else
|
||||||
|
args.v1.ucLaneNum = 4;
|
||||||
|
|
||||||
if ((args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP
|
if ((args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP
|
||||||
|| args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP_MST)
|
|| args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP_MST)
|
||||||
&& dpClock == 270000) {
|
&& dpClock == 270000) {
|
||||||
@@ -644,8 +669,8 @@ encoder_dig_setup(uint32 connectorIndex, uint32 pixelClock, int command)
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
case 3:
|
case 3:
|
||||||
args.v1.ucAction = command;
|
args.v3.ucAction = command;
|
||||||
args.v1.usPixelClock = B_HOST_TO_LENDIAN_INT16(pixelClock / 10);
|
args.v3.usPixelClock = B_HOST_TO_LENDIAN_INT16(pixelClock / 10);
|
||||||
|
|
||||||
if (command == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
|
if (command == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
|
||||||
args.v3.ucPanelMode = panelMode;
|
args.v3.ucPanelMode = panelMode;
|
||||||
@@ -654,16 +679,16 @@ encoder_dig_setup(uint32 connectorIndex, uint32 pixelClock, int command)
|
|||||||
= display_get_encoder_mode(connectorIndex);
|
= display_get_encoder_mode(connectorIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP
|
if (args.v3.ucEncoderMode == ATOM_ENCODER_MODE_DP
|
||||||
|| args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP_MST) {
|
|| args.v3.ucEncoderMode == ATOM_ENCODER_MODE_DP_MST) {
|
||||||
args.v1.ucLaneNum = dpInfo->laneCount;
|
args.v3.ucLaneNum = dpInfo->laneCount;
|
||||||
} else if (pixelClock > 165000)
|
} else if (dualLink)
|
||||||
args.v1.ucLaneNum = 8;
|
args.v3.ucLaneNum = 8;
|
||||||
else
|
else
|
||||||
args.v1.ucLaneNum = 4;
|
args.v3.ucLaneNum = 4;
|
||||||
|
|
||||||
if ((args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP
|
if ((args.v3.ucEncoderMode == ATOM_ENCODER_MODE_DP
|
||||||
|| args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP_MST)
|
|| args.v3.ucEncoderMode == ATOM_ENCODER_MODE_DP_MST)
|
||||||
&& dpClock == 270000) {
|
&& dpClock == 270000) {
|
||||||
args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
|
args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
|
||||||
}
|
}
|
||||||
@@ -673,23 +698,23 @@ encoder_dig_setup(uint32 connectorIndex, uint32 pixelClock, int command)
|
|||||||
// TODO: get BPC
|
// TODO: get BPC
|
||||||
switch (8) {
|
switch (8) {
|
||||||
case 0:
|
case 0:
|
||||||
args.v4.ucBitPerColor = PANEL_BPC_UNDEFINE;
|
args.v3.ucBitPerColor = PANEL_BPC_UNDEFINE;
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
args.v4.ucBitPerColor = PANEL_6BIT_PER_COLOR;
|
args.v3.ucBitPerColor = PANEL_6BIT_PER_COLOR;
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
default:
|
default:
|
||||||
args.v4.ucBitPerColor = PANEL_8BIT_PER_COLOR;
|
args.v3.ucBitPerColor = PANEL_8BIT_PER_COLOR;
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
args.v4.ucBitPerColor = PANEL_10BIT_PER_COLOR;
|
args.v3.ucBitPerColor = PANEL_10BIT_PER_COLOR;
|
||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
args.v4.ucBitPerColor = PANEL_12BIT_PER_COLOR;
|
args.v3.ucBitPerColor = PANEL_12BIT_PER_COLOR;
|
||||||
break;
|
break;
|
||||||
case 16:
|
case 16:
|
||||||
args.v4.ucBitPerColor = PANEL_16BIT_PER_COLOR;
|
args.v3.ucBitPerColor = PANEL_16BIT_PER_COLOR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user