Improve legacy card support and cleanup
* break apart encoder type lookup to share with legacy connector probe * add function to check for external encoders * reduce chip requirement to Avivo+ from R600 for register population
This commit is contained in:
@@ -151,8 +151,8 @@ init_registers(register_info* regs, uint8 crtcID)
|
|||||||
regs->viewportStart = AVIVO_D1MODE_VIEWPORT_START + offset;
|
regs->viewportStart = AVIVO_D1MODE_VIEWPORT_START + offset;
|
||||||
regs->viewportSize = AVIVO_D1MODE_VIEWPORT_SIZE + offset;
|
regs->viewportSize = AVIVO_D1MODE_VIEWPORT_SIZE + offset;
|
||||||
|
|
||||||
} else if (info.chipsetID >= RADEON_R600) {
|
} else if (info.chipsetID >= RADEON_RS600) {
|
||||||
// R600 series+
|
// Avivo+
|
||||||
uint32 offset = 0;
|
uint32 offset = 0;
|
||||||
|
|
||||||
switch(crtcID) {
|
switch(crtcID) {
|
||||||
@@ -302,7 +302,6 @@ detect_connectors_legacy()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO: give tv unique connector ids
|
// TODO: give tv unique connector ids
|
||||||
|
|
||||||
// Always set CRT1 and CRT2 as VGA, some cards incorrectly set
|
// Always set CRT1 and CRT2 as VGA, some cards incorrectly set
|
||||||
@@ -312,18 +311,19 @@ detect_connectors_legacy()
|
|||||||
|
|
||||||
uint8 dac = ci.sucConnectorInfo.sbfAccess.bfAssociatedDAC;
|
uint8 dac = ci.sucConnectorInfo.sbfAccess.bfAssociatedDAC;
|
||||||
uint32 encoderObject = encoder_object_lookup((1 << i), dac);
|
uint32 encoderObject = encoder_object_lookup((1 << i), dac);
|
||||||
|
uint32 encoderID = (encoderObject & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
|
||||||
|
|
||||||
gConnector[connectorIndex]->valid = true;
|
gConnector[connectorIndex]->valid = true;
|
||||||
gConnector[connectorIndex]->encoder.flags = (1 << i);
|
gConnector[connectorIndex]->encoder.flags = (1 << i);
|
||||||
gConnector[connectorIndex]->encoder.valid = true;
|
gConnector[connectorIndex]->encoder.valid = true;
|
||||||
gConnector[connectorIndex]->encoder.objectID
|
gConnector[connectorIndex]->encoder.objectID = encoderID;
|
||||||
= (encoderObject & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
|
gConnector[connectorIndex]->encoder.type
|
||||||
|
= encoder_type_lookup(encoderID, (1 << i));
|
||||||
|
gConnector[connectorIndex]->encoder.isExternal
|
||||||
|
= encoder_isexternal(encoderID);
|
||||||
|
|
||||||
radeon_gpu_i2c_attach(connectorIndex, ci.sucI2cId.ucAccess);
|
radeon_gpu_i2c_attach(connectorIndex, ci.sucI2cId.ucAccess);
|
||||||
|
|
||||||
//gConnector[connectorIndex]->encoder.isExternal
|
|
||||||
// = encoderExternal;
|
|
||||||
|
|
||||||
pll_limit_probe(&gConnector[connectorIndex]->encoder.pll);
|
pll_limit_probe(&gConnector[connectorIndex]->encoder.pll);
|
||||||
|
|
||||||
connectorIndex++;
|
connectorIndex++;
|
||||||
@@ -491,80 +491,18 @@ detect_connectors()
|
|||||||
record = (ATOM_COMMON_RECORD_HEADER *)
|
record = (ATOM_COMMON_RECORD_HEADER *)
|
||||||
((char *)record + record->ucRecordSize);
|
((char *)record + record->ucRecordSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 encoderID = (encoder_obj & OBJECT_ID_MASK)
|
uint32 encoderID = (encoder_obj & OBJECT_ID_MASK)
|
||||||
>> OBJECT_ID_SHIFT;
|
>> OBJECT_ID_SHIFT;
|
||||||
|
|
||||||
uint32 encoderType = VIDEO_ENCODER_NONE;
|
uint32 encoderType = encoder_type_lookup(encoderID,
|
||||||
bool encoderExternal = false;
|
connectorFlags);
|
||||||
|
|
||||||
switch(encoderID) {
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_LVDS:
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
|
|
||||||
if ((connectorFlags
|
|
||||||
& ATOM_DEVICE_LCD_SUPPORT) != 0) {
|
|
||||||
encoderType = VIDEO_ENCODER_LVDS;
|
|
||||||
// radeon_atombios_get_lvds_info
|
|
||||||
} else {
|
|
||||||
encoderType = VIDEO_ENCODER_TMDS;
|
|
||||||
// radeon_atombios_set_dig_info
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_DAC1:
|
|
||||||
encoderType = VIDEO_ENCODER_DAC;
|
|
||||||
break;
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_DAC2:
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
|
|
||||||
encoderType = VIDEO_ENCODER_TVDAC;
|
|
||||||
break;
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_DVO1:
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_DDI:
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
|
|
||||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
|
|
||||||
if ((connectorFlags
|
|
||||||
& ATOM_DEVICE_LCD_SUPPORT) != 0) {
|
|
||||||
encoderType = VIDEO_ENCODER_LVDS;
|
|
||||||
} else if ((connectorFlags
|
|
||||||
& ATOM_DEVICE_CRT_SUPPORT) != 0) {
|
|
||||||
encoderType = VIDEO_ENCODER_DAC;
|
|
||||||
} else {
|
|
||||||
encoderType = VIDEO_ENCODER_TMDS;
|
|
||||||
}
|
|
||||||
// drm_encoder_helper_add
|
|
||||||
break;
|
|
||||||
case ENCODER_OBJECT_ID_SI170B:
|
|
||||||
case ENCODER_OBJECT_ID_CH7303:
|
|
||||||
case ENCODER_OBJECT_ID_EXTERNAL_SDVOA:
|
|
||||||
case ENCODER_OBJECT_ID_EXTERNAL_SDVOB:
|
|
||||||
case ENCODER_OBJECT_ID_TITFP513:
|
|
||||||
case ENCODER_OBJECT_ID_VT1623:
|
|
||||||
case ENCODER_OBJECT_ID_HDMI_SI1930:
|
|
||||||
case ENCODER_OBJECT_ID_TRAVIS:
|
|
||||||
case ENCODER_OBJECT_ID_NUTMEG:
|
|
||||||
encoderExternal = true;
|
|
||||||
if ((connectorFlags
|
|
||||||
& ATOM_DEVICE_LCD_SUPPORT) != 0) {
|
|
||||||
encoderType = VIDEO_ENCODER_LVDS;
|
|
||||||
} else if ((connectorFlags
|
|
||||||
& ATOM_DEVICE_CRT_SUPPORT) != 0) {
|
|
||||||
encoderType = VIDEO_ENCODER_DAC;
|
|
||||||
} else {
|
|
||||||
encoderType = VIDEO_ENCODER_TMDS;
|
|
||||||
}
|
|
||||||
// drm_encoder_helper_add
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (encoderType == VIDEO_ENCODER_NONE) {
|
if (encoderType == VIDEO_ENCODER_NONE) {
|
||||||
ERROR("%s: Path #%" B_PRId32 ":"
|
ERROR("%s: Path #%" B_PRId32 ":"
|
||||||
"skipping unknown encoder.\n",
|
"skipping unknown encoder.\n",
|
||||||
__func__, i);
|
__func__, i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up encoder on connector if valid
|
// Set up encoder on connector if valid
|
||||||
@@ -572,16 +510,16 @@ detect_connectors()
|
|||||||
"%s\n", __func__, i,
|
"%s\n", __func__, i,
|
||||||
get_encoder_name(encoderType));
|
get_encoder_name(encoderType));
|
||||||
|
|
||||||
gConnector[connectorIndex]->encoder.flags
|
|
||||||
= connectorFlags;
|
|
||||||
gConnector[connectorIndex]->encoder.valid
|
gConnector[connectorIndex]->encoder.valid
|
||||||
= true;
|
= true;
|
||||||
|
gConnector[connectorIndex]->encoder.flags
|
||||||
|
= connectorFlags;
|
||||||
gConnector[connectorIndex]->encoder.objectID
|
gConnector[connectorIndex]->encoder.objectID
|
||||||
= encoderID;
|
= encoderID;
|
||||||
gConnector[connectorIndex]->encoder.type
|
gConnector[connectorIndex]->encoder.type
|
||||||
= encoderType;
|
= encoderType;
|
||||||
gConnector[connectorIndex]->encoder.isExternal
|
gConnector[connectorIndex]->encoder.isExternal
|
||||||
= encoderExternal;
|
= encoder_isexternal(encoderID);
|
||||||
|
|
||||||
pll_limit_probe(
|
pll_limit_probe(
|
||||||
&gConnector[connectorIndex]->encoder.pll);
|
&gConnector[connectorIndex]->encoder.pll);
|
||||||
|
|||||||
@@ -935,7 +935,7 @@ uint32
|
|||||||
encoder_object_lookup(uint32 encoderFlags, uint8 dacID)
|
encoder_object_lookup(uint32 encoderFlags, uint8 dacID)
|
||||||
{
|
{
|
||||||
// used on older cards to take a guess at the encoder
|
// used on older cards to take a guess at the encoder
|
||||||
// objectID
|
// object
|
||||||
|
|
||||||
radeon_shared_info &info = *gInfo->shared_info;
|
radeon_shared_info &info = *gInfo->shared_info;
|
||||||
|
|
||||||
@@ -1005,3 +1005,78 @@ encoder_object_lookup(uint32 encoderFlags, uint8 dacID)
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint32
|
||||||
|
encoder_type_lookup(uint32 encoderID, uint32 connectorFlags)
|
||||||
|
{
|
||||||
|
switch(encoderID) {
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_LVDS:
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
|
||||||
|
if ((connectorFlags & ATOM_DEVICE_LCD_SUPPORT) != 0)
|
||||||
|
return VIDEO_ENCODER_LVDS;
|
||||||
|
else
|
||||||
|
return VIDEO_ENCODER_TMDS;
|
||||||
|
break;
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_DAC1:
|
||||||
|
return VIDEO_ENCODER_DAC;
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_DAC2:
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
|
||||||
|
return VIDEO_ENCODER_TVDAC;
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_DVO1:
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_DDI:
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
|
||||||
|
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
|
||||||
|
if ((connectorFlags & ATOM_DEVICE_LCD_SUPPORT) != 0)
|
||||||
|
return VIDEO_ENCODER_LVDS;
|
||||||
|
else if ((connectorFlags & ATOM_DEVICE_CRT_SUPPORT) != 0)
|
||||||
|
return VIDEO_ENCODER_DAC;
|
||||||
|
else
|
||||||
|
return VIDEO_ENCODER_TMDS;
|
||||||
|
break;
|
||||||
|
case ENCODER_OBJECT_ID_SI170B:
|
||||||
|
case ENCODER_OBJECT_ID_CH7303:
|
||||||
|
case ENCODER_OBJECT_ID_EXTERNAL_SDVOA:
|
||||||
|
case ENCODER_OBJECT_ID_EXTERNAL_SDVOB:
|
||||||
|
case ENCODER_OBJECT_ID_TITFP513:
|
||||||
|
case ENCODER_OBJECT_ID_VT1623:
|
||||||
|
case ENCODER_OBJECT_ID_HDMI_SI1930:
|
||||||
|
case ENCODER_OBJECT_ID_TRAVIS:
|
||||||
|
case ENCODER_OBJECT_ID_NUTMEG:
|
||||||
|
if ((connectorFlags & ATOM_DEVICE_LCD_SUPPORT) != 0)
|
||||||
|
return VIDEO_ENCODER_LVDS;
|
||||||
|
else if ((connectorFlags & ATOM_DEVICE_CRT_SUPPORT) != 0)
|
||||||
|
return VIDEO_ENCODER_DAC;
|
||||||
|
else
|
||||||
|
return VIDEO_ENCODER_TMDS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return VIDEO_ENCODER_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
encoder_isexternal(uint32 encoderID)
|
||||||
|
{
|
||||||
|
switch (encoderID) {
|
||||||
|
case ENCODER_OBJECT_ID_SI170B:
|
||||||
|
case ENCODER_OBJECT_ID_CH7303:
|
||||||
|
case ENCODER_OBJECT_ID_EXTERNAL_SDVOA:
|
||||||
|
case ENCODER_OBJECT_ID_EXTERNAL_SDVOB:
|
||||||
|
case ENCODER_OBJECT_ID_TITFP513:
|
||||||
|
case ENCODER_OBJECT_ID_VT1623:
|
||||||
|
case ENCODER_OBJECT_ID_HDMI_SI1930:
|
||||||
|
case ENCODER_OBJECT_ID_TRAVIS:
|
||||||
|
case ENCODER_OBJECT_ID_NUTMEG:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ void encoder_crtc_scratch(uint8 crtcID);
|
|||||||
void encoder_dpms_scratch(uint8 crtcID, bool power);
|
void encoder_dpms_scratch(uint8 crtcID, bool power);
|
||||||
void encoder_dpms_set(uint8 crtcID, uint8 encoderID, int mode);
|
void encoder_dpms_set(uint8 crtcID, uint8 encoderID, int mode);
|
||||||
uint32 encoder_object_lookup(uint32 encoderFlags, uint8 dacID);
|
uint32 encoder_object_lookup(uint32 encoderFlags, uint8 dacID);
|
||||||
|
uint32 encoder_type_lookup(uint32 encoderID, uint32 connectorFlags);
|
||||||
|
bool encoder_isexternal(uint32 encoderID);
|
||||||
|
|
||||||
|
|
||||||
#endif /* RADEON_HD_ENCODER_H */
|
#endif /* RADEON_HD_ENCODER_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user