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?= <daen...@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 <daen...@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);