[haiku-commits] haiku: hrev43265 - src/add-ons/accelerants/radeon_hd

  • From: kallisti5@xxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 14 Nov 2011 06:30:38 +0100 (CET)

Revision:    hrev43265
Commit:      5a2c35728db67844504cd3d5cb5a334b7232c2c1
URL:         http://cgit.haiku-os.org/haiku/commit/?id=5a2c357
Author:      Alexander von Gluck IV <kallisti5@xxxxxxxxxxx>
Date:        Mon Nov 14 05:07:23 2011 UTC

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

............................................................................

 src/add-ons/accelerants/radeon_hd/display.cpp |   92 ++++-----------------
 src/add-ons/accelerants/radeon_hd/encoder.cpp |   77 +++++++++++++++++-
 src/add-ons/accelerants/radeon_hd/encoder.h   |    3 +-
 3 files changed, 93 insertions(+), 79 deletions(-)

diff --git a/src/add-ons/accelerants/radeon_hd/display.cpp 
b/src/add-ons/accelerants/radeon_hd/display.cpp
index b3b8ca7..5c2ff1a 100644
--- a/src/add-ons/accelerants/radeon_hd/display.cpp
+++ b/src/add-ons/accelerants/radeon_hd/display.cpp
@@ -151,8 +151,8 @@ init_registers(register_info* regs, uint8 crtcID)
                regs->viewportStart = AVIVO_D1MODE_VIEWPORT_START + offset;
                regs->viewportSize = AVIVO_D1MODE_VIEWPORT_SIZE + offset;
 
-       } else if (info.chipsetID >= RADEON_R600) {
-               // R600 series+
+       } else if (info.chipsetID >= RADEON_RS600) {
+               // Avivo+
                uint32 offset = 0;
 
                switch(crtcID) {
@@ -302,7 +302,6 @@ detect_connectors_legacy()
                        continue;
                }
 
-
                // TODO: give tv unique connector ids
 
                // Always set CRT1 and CRT2 as VGA, some cards incorrectly set
@@ -312,18 +311,19 @@ detect_connectors_legacy()
 
                uint8 dac = ci.sucConnectorInfo.sbfAccess.bfAssociatedDAC;
                uint32 encoderObject = encoder_object_lookup((1 << i), dac);
+               uint32 encoderID = (encoderObject & OBJECT_ID_MASK) >> 
OBJECT_ID_SHIFT;
 
                gConnector[connectorIndex]->valid = true;
                gConnector[connectorIndex]->encoder.flags = (1 << i);
                gConnector[connectorIndex]->encoder.valid = true;
-               gConnector[connectorIndex]->encoder.objectID
-                       = (encoderObject & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
+               gConnector[connectorIndex]->encoder.objectID = encoderID;
+               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);
 
-               //gConnector[connectorIndex]->encoder.isExternal
-               //      = encoderExternal;
-
                pll_limit_probe(&gConnector[connectorIndex]->encoder.pll);
 
                connectorIndex++;
@@ -491,80 +491,18 @@ detect_connectors()
                                                                record = 
(ATOM_COMMON_RECORD_HEADER *)
                                                                        ((char 
*)record + record->ucRecordSize);
                                                        }
+
                                                        uint32 encoderID = 
(encoder_obj & OBJECT_ID_MASK)
                                                                >> 
OBJECT_ID_SHIFT;
 
-                                                       uint32 encoderType = 
VIDEO_ENCODER_NONE;
-                                                       bool encoderExternal = 
false;
-
-                                                       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;
-                                                       }
+                                                       uint32 encoderType = 
encoder_type_lookup(encoderID,
+                                                               connectorFlags);
 
                                                        if (encoderType == 
VIDEO_ENCODER_NONE) {
                                                                ERROR("%s: Path 
#%" B_PRId32 ":"
                                                                        
"skipping unknown encoder.\n",
                                                                        
__func__, i);
-                                                                       
continue;
+                                                               continue;
                                                        }
 
                                                        // Set up encoder on 
connector if valid
@@ -572,16 +510,16 @@ detect_connectors()
                                                                "%s\n", 
__func__, i,
                                                                
get_encoder_name(encoderType));
 
-                                                       
gConnector[connectorIndex]->encoder.flags
-                                                               = 
connectorFlags;
                                                        
gConnector[connectorIndex]->encoder.valid
                                                                = true;
+                                                       
gConnector[connectorIndex]->encoder.flags
+                                                               = 
connectorFlags;
                                                        
gConnector[connectorIndex]->encoder.objectID
                                                                = encoderID;
                                                        
gConnector[connectorIndex]->encoder.type
                                                                = encoderType;
                                                        
gConnector[connectorIndex]->encoder.isExternal
-                                                               = 
encoderExternal;
+                                                               = 
encoder_isexternal(encoderID);
 
                                                        pll_limit_probe(
                                                                
&gConnector[connectorIndex]->encoder.pll);
diff --git a/src/add-ons/accelerants/radeon_hd/encoder.cpp 
b/src/add-ons/accelerants/radeon_hd/encoder.cpp
index 2701b27..a09654f 100644
--- a/src/add-ons/accelerants/radeon_hd/encoder.cpp
+++ b/src/add-ons/accelerants/radeon_hd/encoder.cpp
@@ -935,7 +935,7 @@ uint32
 encoder_object_lookup(uint32 encoderFlags, uint8 dacID)
 {
        // used on older cards to take a guess at the encoder
-       // objectID
+       // object
 
        radeon_shared_info &info = *gInfo->shared_info;
 
@@ -1005,3 +1005,78 @@ encoder_object_lookup(uint32 encoderFlags, uint8 dacID)
 
        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;
+}
diff --git a/src/add-ons/accelerants/radeon_hd/encoder.h 
b/src/add-ons/accelerants/radeon_hd/encoder.h
index ad358e1..fb39070 100644
--- a/src/add-ons/accelerants/radeon_hd/encoder.h
+++ b/src/add-ons/accelerants/radeon_hd/encoder.h
@@ -22,7 +22,8 @@ void encoder_crtc_scratch(uint8 crtcID);
 void encoder_dpms_scratch(uint8 crtcID, bool power);
 void encoder_dpms_set(uint8 crtcID, uint8 encoderID, int mode);
 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 */


Other related posts:

  • » [haiku-commits] haiku: hrev43265 - src/add-ons/accelerants/radeon_hd - kallisti5