From: Dave Airlie <airl...@redhat.com>

The RN50 really needs this since its a single crtc card,
however other gpus may benefit from it as well.

Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 drivers/gpu/drm/radeon/radeon_encoders.c        |   38 ++++++++++++++++++++++-
 drivers/gpu/drm/radeon/radeon_legacy_encoders.c |    3 +-
 drivers/gpu/drm/radeon/radeon_mode.h            |    1 +
 3 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c 
b/drivers/gpu/drm/radeon/radeon_encoders.c
index 10845f3..56bb0c2 100644
--- a/drivers/gpu/drm/radeon/radeon_encoders.c
+++ b/drivers/gpu/drm/radeon/radeon_encoders.c
@@ -36,6 +36,42 @@ bool radeon_atom_get_tv_timings(struct radeon_device *rdev, 
int index,
                                struct drm_display_mode *mode);
 
 uint32_t
+radeon_encoder_clones(struct drm_encoder *encoder)
+{
+       struct drm_device *dev = encoder->dev;
+       struct radeon_device *rdev = dev->dev_private;
+       struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
+       struct drm_encoder *clone_encoder;
+       uint32_t index_mask = 0;
+       int count;
+
+       /* DIG routing gets problematic */
+       if (ASIC_IS_DCE32(rdev))
+               return index_mask;
+       /* LVDS/TV are too wacky */
+       if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
+               return index_mask;
+       if (radeon_encoder->devices & ATOM_DEVICE_TV_SUPPORT)
+               return index_mask;
+       
+       count = -1;
+       list_for_each_entry(clone_encoder, &dev->mode_config.encoder_list, 
head) {
+               struct radeon_encoder *radeon_clone = 
to_radeon_encoder(clone_encoder);
+               count++;
+
+               if (clone_encoder == encoder)
+                       continue;
+               if (radeon_clone->devices & (ATOM_DEVICE_LCD_SUPPORT))
+                       continue;
+               if (radeon_clone->devices & (ATOM_DEVICE_TV_SUPPORT))
+                       continue;
+               else
+                       index_mask |= (1 << count);
+       }
+       return index_mask;
+}
+
+uint32_t
 radeon_get_encoder_id(struct drm_device *dev, uint32_t supported_device, 
uint8_t dac)
 {
        struct radeon_device *rdev = dev->dev_private;
@@ -1355,7 +1391,6 @@ radeon_add_atom_encoder(struct drm_device *dev, uint32_t 
encoder_id, uint32_t su
                encoder->possible_crtcs = 0x1;
        else
                encoder->possible_crtcs = 0x3;
-       encoder->possible_clones = 0;
 
        radeon_encoder->enc_priv = NULL;
 
@@ -1407,4 +1442,5 @@ radeon_add_atom_encoder(struct drm_device *dev, uint32_t 
encoder_id, uint32_t su
                drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs);
                break;
        }
+       encoder->possible_clones = radeon_encoder_clones(encoder);
 }
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c 
b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
index 6ceb958..c1d7f9b 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
@@ -1322,7 +1322,6 @@ radeon_add_legacy_encoder(struct drm_device *dev, 
uint32_t encoder_id, uint32_t
                encoder->possible_crtcs = 0x1;
        else
                encoder->possible_crtcs = 0x3;
-       encoder->possible_clones = 0;
 
        radeon_encoder->enc_priv = NULL;
 
@@ -1369,4 +1368,6 @@ radeon_add_legacy_encoder(struct drm_device *dev, 
uint32_t encoder_id, uint32_t
                        radeon_combios_get_ext_tmds_info(radeon_encoder);
                break;
        }
+
+       encoder->possible_clones = radeon_encoder_clones(encoder);
 }
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h 
b/drivers/gpu/drm/radeon/radeon_mode.h
index 3d2631b..82d0289 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -328,6 +328,7 @@ extern void radeon_compute_pll(struct radeon_pll *pll,
                               uint32_t *post_div_p,
                               int flags);
 
+extern uint32_t radeon_encoder_clones(struct drm_encoder *encoder);
 struct drm_encoder *radeon_encoder_legacy_lvds_add(struct drm_device *dev, int 
bios_index);
 struct drm_encoder *radeon_encoder_legacy_primary_dac_add(struct drm_device 
*dev, int bios_index, int with_tv);
 struct drm_encoder *radeon_encoder_legacy_tv_dac_add(struct drm_device *dev, 
int bios_index, int with_tv);
-- 
1.6.5.rc2


------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to