[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#575681: xserver-xorg-video-radeon: shows severe artifacts since switching to KMS



Dear Michel,

Am Donnerstag, den 01.04.2010, 12:59 +0200 schrieb Michel Dänzer:
> > Will try to test it within the next few days.
> Great, thanks.

I tried the patch and can confirm that it works [*] and that it solves
the actual issue: No more artifacts in X for me. Thank you very much!

dmesg now shows the following line:

$ dmesg  | grep -i pipe 
[    5.466112] [drm] radeon: 1 quad pipes, 1 Z pipes initialized.

[*] That is, I don't know which version of the kernel you used to create
the patch, but I had to slightly modify it a bit. The attached version
applies perfectly against version 2.6.32-10 in Debian.

Dear Kernel team, please apply this patch. Furthermore I think it should
get integrated upstream. Thank you very much again to all involved!

Cheers,
Fabian

>From ac8c8618c625039ec29870c2a9c36733695ecd56 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <daenzer@vmware.com>
Date: Thu, 1 Apr 2010 10:18:09 +0200
Subject: [PATCH] drm/radeon: R300 AD only has one quad pipe.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Gleaned from the Mesa code.

Signed-off-by: Michel Dänzer <daenzer@vmware.com>
---
 drivers/gpu/drm/radeon/r300.c      |    6 +++---
 drivers/gpu/drm/radeon/radeon_cp.c |   10 ++++++----
 2 files changed, 9 insertions(+), 7 deletions(-)

--- linux-2.6-2.6.32.orig/drivers/gpu/drm/radeon/r300.c
+++ linux-2.6-2.6.32/drivers/gpu/drm/radeon/r300.c
@@ -345,12 +345,12 @@
 	uint32_t gb_tile_config, tmp;
 
 	r100_hdp_reset(rdev);
-	/* FIXME: rv380 one pipes ? */
-	if ((rdev->family == CHIP_R300) || (rdev->family == CHIP_R350)) {
+	if ((rdev->family == CHIP_R300 && rdev->pdev->device != 0x4144) ||
+	    (rdev->family == CHIP_R350)) {
 		/* r300,r350 */
 		rdev->num_gb_pipes = 2;
 	} else {
-		/* rv350,rv370,rv380 */
+		/* rv350,rv370,rv380,r300 AD */
 		rdev->num_gb_pipes = 1;
 	}
 	rdev->num_z_pipes = 1;
--- linux-2.6-2.6.32.orig/drivers/gpu/drm/radeon/radeon_cp.c
+++ linux-2.6-2.6.32/drivers/gpu/drm/radeon/radeon_cp.c
@@ -417,8 +417,9 @@
 	return -EBUSY;
 }
 
-static void radeon_init_pipes(drm_radeon_private_t *dev_priv)
+static void radeon_init_pipes(struct drm_device *dev)
 {
+	drm_radeon_private_t *dev_priv = dev->dev_private;
 	uint32_t gb_tile_config, gb_pipe_sel = 0;
 
 	if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV530) {
@@ -436,11 +437,12 @@
 		dev_priv->num_gb_pipes = ((gb_pipe_sel >> 12) & 0x3) + 1;
 	} else {
 		/* R3xx */
-		if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R300) ||
+		if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R300 &&
+		     dev->pdev->device != 0x4144) ||
 		    ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R350)) {
 			dev_priv->num_gb_pipes = 2;
 		} else {
-			/* R3Vxx */
+			/* RV3xx/R300 AD */
 			dev_priv->num_gb_pipes = 1;
 		}
 	}
@@ -736,7 +738,7 @@
 
 	/* setup the raster pipes */
 	if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R300)
-	    radeon_init_pipes(dev_priv);
+	    radeon_init_pipes(dev);
 
 	/* Reset the CP ring */
 	radeon_do_cp_reset(dev_priv);

Reply to: