DisplayPort call organization and cleanup

* Add color space to BPP function
* Pass display_mode to DP lane count function
* Get BPP in DP lane count
* Move some DPInfo population out of DP link training
  as other things need them sooner.
* Fill out DP code in external encoder setup
This commit is contained in:
Alexander von Gluck IV
2011-12-15 17:18:39 -06:00
parent 099d5afd11
commit 09aaa658b0
7 changed files with 51 additions and 28 deletions
@@ -699,12 +699,6 @@ connector_probe()
break;
}
if (gConnector[connectorIndex]->encoder.isDPBridge == true) {
TRACE("%s: is bridge, performing bridge DDC setup\n", __func__);
encoder_external_setup(connectorIndex, 0,
EXTERNAL_ENCODER_ACTION_V3_DDC_SETUP);
}
connectorIndex++;
} // END for each valid connector
} // end for each display path
@@ -256,6 +256,12 @@ detect_displays()
if (displayIndex >= MAX_DISPLAY)
continue;
if (gConnector[id]->encoder.isDPBridge == true) {
// if this is a DisplayPort Bridge, setup ddc on bus
TRACE("%s: is bridge, performing bridge DDC setup\n", __func__);
encoder_external_setup(id, 0, EXTERNAL_ENCODER_ACTION_V3_DDC_SETUP);
}
if (connector_read_edid(id, &gDisplay[displayIndex]->edid_info)) {
if (gConnector[id]->encoder.type == VIDEO_ENCODER_TVDAC
@@ -14,6 +14,7 @@
#include "accelerant.h"
#include "accelerant_protos.h"
#include "connector.h"
#include "mode.h"
#undef TRACE
@@ -360,11 +361,10 @@ dp_get_link_clock_decode(uint32 dpLinkClock)
}
static uint32
dp_get_lane_count(uint32 connectorIndex, uint32 pixelClock)
uint32
dp_get_lane_count(uint32 connectorIndex, display_mode* mode)
{
// TODO: bpp hardcoded
uint32 bitsPerPixel = 32;
uint32 bitsPerPixel = get_mode_bpp(mode);
uint32 maxLaneCount = gDPInfo[connectorIndex]->config[DP_MAX_LANE_COUNT]
& DP_MAX_LANE_COUNT_MASK;
@@ -375,7 +375,7 @@ dp_get_lane_count(uint32 connectorIndex, uint32 pixelClock)
uint32 lane;
for (lane = 1; lane < maxLaneCount; lane <<= 1) {
uint32 maxDPPixelClock = (maxLinkRate * lane * 8) / bitsPerPixel;
if (pixelClock <= maxDPPixelClock)
if (mode->timing.pixel_clock <= maxDPPixelClock)
break;
}
TRACE("%s: connector: %" B_PRIu32 ", lanes: %" B_PRIu32 "\n", __func__,
@@ -413,6 +413,8 @@ dp_setup_connectors()
gDPInfo[index]->valid = true;
memcpy(gDPInfo[index]->config, auxMessage, 8);
}
gDPInfo[index]->clock = dp_get_link_clock(index);
}
}
@@ -429,10 +431,6 @@ dp_link_train(uint8 crtcID, display_mode* mode)
return B_ERROR;
}
gDPInfo[connectorIndex]->clock = dp_get_link_clock(connectorIndex);
gDPInfo[connectorIndex]->laneCount
= dp_get_lane_count(connectorIndex, mode->timing.pixel_clock);
int index = GetIndexIntoMasterTable(COMMAND, DPEncoderService);
// Table version
uint8 tableMajor;
@@ -25,6 +25,7 @@ status_t dp_aux_set_i2c_byte(uint32 hwPin, uint16 address,
status_t dp_aux_get_i2c_byte(uint32 hwPin, uint16 address,
uint8* data, bool end);
uint32 dp_get_lane_count(uint32 connectorIndex, display_mode* mode);
uint32 dp_get_link_clock(uint32 connectorIndex);
uint32 dp_get_link_clock_encode(uint32 dpLinkClock);
uint32 dp_get_link_clock_decode(uint32 dpLinkClock);
+10 -13
View File
@@ -713,16 +713,15 @@ encoder_external_setup(uint32 connectorIndex, uint32 pixelClock, int command)
= B_HOST_TO_LENDIAN_INT16(pixelClock / 10);
args.v1.sDigEncoder.ucEncoderMode
= display_get_encoder_mode(connectorIndex);
#if 0
if (0) { // ENCODER_MODE_IS_DP(v1.sDigEncoder.ucEncoderMode)
if (dp_clock == 270000) {
if (connector_is_dp(connectorIndex)) {
if (gDPInfo[connectorIndex]->clock == 270000) {
args.v1.sDigEncoder.ucConfig
|= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
}
args.v1.sDigEncoder.ucLaneNum = dp_lane_count;
args.v1.sDigEncoder.ucLaneNum
= gDPInfo[connectorIndex]->laneCount;
} else if (pixelClock > 165000) {
#endif
if (pixelClock > 165000) {
args.v1.sDigEncoder.ucLaneNum = 8;
} else {
args.v1.sDigEncoder.ucLaneNum = 4;
@@ -742,19 +741,17 @@ encoder_external_setup(uint32 connectorIndex, uint32 pixelClock, int command)
args.v3.sExtEncoder.ucEncoderMode
= display_get_encoder_mode(connectorIndex);
#if 0
if (ENCODER_MODE_IS_DP(args.v3.sExtEncoder.ucEncoderMode)) {
if (dp_clock == 270000) {
if (connector_is_dp(connectorIndex)) {
if (gDPInfo[connectorIndex]->clock == 270000) {
args.v3.sExtEncoder.ucConfig
|=EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
} else if (dp_clock == 540000) {
} else if (gDPInfo[connectorIndex]->clock == 540000) {
args.v3.sExtEncoder.ucConfig
|=EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_5_40GHZ;
}
args.v3.sExtEncoder.ucLaneNum = dp_lane_count;
args.v1.sDigEncoder.ucLaneNum
= gDPInfo[connectorIndex]->laneCount;
} else if (pixelClock > 165000) {
#endif
if (pixelClock > 165000) {
args.v3.sExtEncoder.ucLaneNum = 8;
} else {
args.v3.sExtEncoder.ucLaneNum = 4;
@@ -37,6 +37,7 @@ extern "C" void _sPrintf(const char* format, ...);
# define TRACE(x...) ;
#endif
#define ERROR(x...) _sPrintf("radeon_hd: " x)
status_t
create_mode_list(void)
@@ -172,6 +173,11 @@ radeon_set_display_mode(display_mode* mode)
uint16 connectorIndex = gDisplay[id]->connectorIndex;
// Determine DP lanes if DP
if (connector_is_dp(connectorIndex))
gDPInfo[connectorIndex]->laneCount
= dp_get_lane_count(connectorIndex, mode);
// *** encoder prep
encoder_output_lock(true);
encoder_dpms_set(id, gConnector[connectorIndex]->encoder.objectID,
@@ -399,3 +405,23 @@ is_mode_sane(display_mode* mode)
}
uint32
get_mode_bpp(display_mode* mode)
{
// Get bitsPerPixel for given mode
switch (mode->space) {
case B_CMAP8:
return 8;
case B_RGB15_LITTLE:
return 15;
case B_RGB16_LITTLE:
return 16;
case B_RGB24_LITTLE:
case B_RGB32_LITTLE:
return 32;
}
ERROR("%s: Unknown colorspace for mode, guessing 32 bits per pixel\n",
__func__);
return 32;
}
+1
View File
@@ -33,6 +33,7 @@ status_t is_mode_sane(display_mode* mode);
uint32 radeon_dpms_capabilities(void);
uint32 radeon_dpms_mode(void);
void radeon_dpms_set(int mode);
uint32 get_mode_bpp(display_mode* mode);
#endif /*RADEON_HD_MODE_H*/