Skip to contentSkip to conversation

drm/radeon: fix dual-head on rv250

PATCH In review Dave Airlie 2 participants 2 messages Jun 9, 2010

Subsystems (2)
lore
Share & tools
lore

Dave Airlie

author maintainer
#0 lore raw

PATCH 1/1 drm/radeon: fix dual-head on rv250

From: Dave Airlie <[email protected]>

Plugged in FireMV with the rv250 on it, and the second crtc/dac didn't work, we were reading/writing different registers than we were modifying in the code.

---
 drivers/gpu/drm/radeon/radeon_legacy_encoders.c |   22 +++++++++-------------
 1 files changed, 9 insertions(+), 13 deletions(-)
drivers/gpu/drm/radeon/radeon_legacy_encoders.c +9 -13
index 9b5f62b..23ea127 100644
@@ -931,16 +931,14 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder,
 	if (ASIC_IS_R300(rdev)) {
 		gpiopad_a = RREG32(RADEON_GPIOPAD_A) | 1;
 		disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL);
-	}
-
-	if (rdev->family == CHIP_R200 || ASIC_IS_R300(rdev))
-		disp_tv_out_cntl = RREG32(RADEON_DISP_TV_OUT_CNTL);
-	else
+	} else if (rdev->family != CHIP_R200)
 		disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG);
-
-	if (rdev->family == CHIP_R200)
+	else if (rdev->family == CHIP_R200)
 		fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL);
 
+	if (rdev->family >= CHIP_R200)
+		disp_tv_out_cntl = RREG32(RADEON_DISP_TV_OUT_CNTL);
+
 	if (is_tv) {
 		uint32_t dac_cntl;
 
@@ -1005,15 +1003,13 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder,
 	if (ASIC_IS_R300(rdev)) {
 		WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1);
 		WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl);
-	}
+	} else if (rdev->family != CHIP_R200)
+		WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug);
+	else if (rdev->family == CHIP_R200)
+		WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);
 
 	if (rdev->family >= CHIP_R200)
 		WREG32(RADEON_DISP_TV_OUT_CNTL, disp_tv_out_cntl);
-	else
-		WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug);
-
-	if (rdev->family == CHIP_R200)
-		WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);
 
 	if (is_tv)
 		radeon_legacy_tv_mode_set(encoder, mode, adjusted_mode);
Signature · 9 lines
1.6.5.2


------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
--
#1 lore raw
Quoted 6 lines · Dave Airlie

From: Dave Airlie <[email protected]>

Plugged in FireMV with the rv250 on it, and the second crtc/dac didn't work, we were reading/writing different registers than we were modifying in the code.

Quoted 54 lines

---
 drivers/gpu/drm/radeon/radeon_legacy_encoders.c |   22 +++++++++-------------

 1 files changed, 9 insertions(+), 13 deletions(-)
drivers/gpu/drm/radeon/radeon_legacy_encoders.c +9 -14
index 9b5f62b..23ea127 100644
@@ -931,16 +931,14 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder,
        if (ASIC_IS_R300(rdev)) {
                gpiopad_a = RREG32(RADEON_GPIOPAD_A) | 1;
                disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL);
-       }
-
-       if (rdev->family == CHIP_R200 || ASIC_IS_R300(rdev))
-               disp_tv_out_cntl = RREG32(RADEON_DISP_TV_OUT_CNTL);
-       else
+       } else if (rdev->family != CHIP_R200)
                disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG);
-
-       if (rdev->family == CHIP_R200)
+       else if (rdev->family == CHIP_R200)
                fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL);
 
+       if (rdev->family >= CHIP_R200)
+               disp_tv_out_cntl = RREG32(RADEON_DISP_TV_OUT_CNTL);
+
        if (is_tv) {
                uint32_t dac_cntl;
 
@@ -1005,15 +1003,13 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder,
        if (ASIC_IS_R300(rdev)) {
                WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1);
                WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl);
-       }
+       } else if (rdev->family != CHIP_R200)
+               WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug);
+       else if (rdev->family == CHIP_R200)
+               WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);
 
        if (rdev->family >= CHIP_R200)
                WREG32(RADEON_DISP_TV_OUT_CNTL, disp_tv_out_cntl);
-       else
-               WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug);
-
-       if (rdev->family == CHIP_R200)
-               WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);
 
        if (is_tv)
                radeon_legacy_tv_mode_set(encoder, mode, adjusted_mode);
--

1.6.5.2

Quoted 11 lines

------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the lucky parental unit.  See the prize list and enter to win:
http://p.sf.net/sfu/thinkgeek-promo
--
_______________________________________________
Dri-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel

------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the lucky parental unit. See the prize list and enter to win:
http://p.sf.net/sfu/thinkgeek-promo
--