From 119cd5e1c1a4d40cc19903094ec25f86d058a018 Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Tue, 13 Mar 2012 05:09:13 -0500 Subject: [PATCH] radeon_hd: Add missing load detection on DIG encoders --- src/add-ons/accelerants/radeon_hd/encoder.cpp | 54 +++++++++++++++++++ src/add-ons/accelerants/radeon_hd/encoder.h | 2 + 2 files changed, 56 insertions(+) diff --git a/src/add-ons/accelerants/radeon_hd/encoder.cpp b/src/add-ons/accelerants/radeon_hd/encoder.cpp index f27a624c0c..4058590bf4 100644 --- a/src/add-ons/accelerants/radeon_hd/encoder.cpp +++ b/src/add-ons/accelerants/radeon_hd/encoder.cpp @@ -904,6 +904,20 @@ encoder_analog_load_detect(uint32 connectorIndex) { TRACE("%s\n", __func__); + uint32 encoderID = gConnector[connectorIndex]->encoder.objectID; + + if (encoder_is_external(encoderID)) + return encoder_dig_load_detect(connectorIndex); + + return encoder_dac_load_detect(connectorIndex); +} + + +bool +encoder_dac_load_detect(uint32 connectorIndex) +{ + TRACE("%s\n", __func__); + uint32 encoderFlags = gConnector[connectorIndex]->encoder.flags; uint32 encoderID = gConnector[connectorIndex]->encoder.objectID; @@ -994,6 +1008,46 @@ encoder_analog_load_detect(uint32 connectorIndex) } +bool +encoder_dig_load_detect(uint32 connectorIndex) +{ + TRACE("%s\n", __func__); + radeon_shared_info &info = *gInfo->shared_info; + + if (info.dceMajor < 4) { + ERROR("%s: Strange: External DIG encoder on DCE < 4?\n", __func__); + return false; + } + + encoder_external_setup(connectorIndex, 0, + EXTERNAL_ENCODER_ACTION_V3_DACLOAD_DETECTION); + + uint32 biosScratch0 = Read32(OUT, R600_BIOS_0_SCRATCH); + + uint32 encoderFlags = gConnector[connectorIndex]->encoder.flags; + + if ((encoderFlags & ATOM_DEVICE_CRT1_SUPPORT) != 0) + if ((biosScratch0 & ATOM_S0_CRT1_MASK) != 0) + return true; + if ((encoderFlags & ATOM_DEVICE_CRT2_SUPPORT) != 0) + if ((biosScratch0 & ATOM_S0_CRT2_MASK) != 0) + return true; + if ((encoderFlags & ATOM_DEVICE_CV_SUPPORT) != 0) + if ((biosScratch0 & (ATOM_S0_CV_MASK | ATOM_S0_CV_MASK_A)) != 0) + return true; + if ((encoderFlags & ATOM_DEVICE_TV1_SUPPORT) != 0) { + if ((biosScratch0 + & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A)) != 0) + return true; /* Composite connected */ + else if ((biosScratch0 + & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A)) != 0) + return true; /* S-Video connected */ + } + + return false; +} + + status_t transmitter_dig_setup(uint32 connectorIndex, uint32 pixelClock, uint8 laneNumber, uint8 laneSet, int command) diff --git a/src/add-ons/accelerants/radeon_hd/encoder.h b/src/add-ons/accelerants/radeon_hd/encoder.h index 429d1c1f96..2451c625f0 100644 --- a/src/add-ons/accelerants/radeon_hd/encoder.h +++ b/src/add-ons/accelerants/radeon_hd/encoder.h @@ -30,6 +30,8 @@ status_t encoder_tv_setup(uint32 connectorIndex, uint32 pixelClock, int command); bool encoder_analog_load_detect(uint32 connectorIndex); +bool encoder_dac_load_detect(uint32 connectorIndex); +bool encoder_dig_load_detect(uint32 connectorIndex); void encoder_output_lock(bool lock); status_t transmitter_dig_setup(uint32 connectorIndex, uint32 pixelClock, uint8 laneNumber, uint8 laneSet, int command);