From 11e3796f6bf058cb7dd7cee3a3aa2638a93c68a3 Mon Sep 17 00:00:00 2001 From: Richard Thier Date: Sun, 16 Jun 2019 19:11:16 +0200 Subject: [PATCH] Fix rs400_gpu_init for ATI mobility radeon Xpress 200M num_gb_pipes was set to a wrong value using r420_pipe_config This have lead to HyperZ glitches on fast Z clearing. See: https://bugs.freedesktop.org/show_bug.cgi?id=110897 --- drivers/gpu/drm/radeon/r300.c | 3 ++- drivers/gpu/drm/radeon/rs400.c | 22 ++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 652126f..6724c15 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c @@ -355,7 +355,8 @@ int r300_mc_wait_for_idle(struct radeon_device *rdev) return -1; } -static void r300_gpu_init(struct radeon_device *rdev) +/* rs400_gpu_init also calls this! */ +void r300_gpu_init(struct radeon_device *rdev) { uint32_t gb_tile_config, tmp; diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index 4121209..0c3e96c 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c @@ -32,6 +32,9 @@ #include "radeon_asic.h" #include "rs400d.h" +/* Needed for rs400_gpu_init that forwards to the r300 one */ +void r300_gpu_init(struct radeon_device *rdev); + /* This files gather functions specifics to : rs400,rs480 */ static int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev); @@ -252,12 +255,19 @@ int rs400_mc_wait_for_idle(struct radeon_device *rdev) static void rs400_gpu_init(struct radeon_device *rdev) { - /* FIXME: is this correct ? */ - r420_pipes_init(rdev); - if (rs400_mc_wait_for_idle(rdev)) { - pr_warn("rs400: Failed to wait MC idle while programming pipes. Bad things might happen. %08x\n", - RREG32(RADEON_MC_STATUS)); - } + /* FIXME: Earlier code was calling r420_pipes_init and + * rs400_mc_wait_for_idle(rdev). The problems is that + * at least on my Mobility Radeon Xpress 200M RC410 card + * that ends up in this code path ends up num_gb_pipes == 3 + * while the card seems to have only one pipe. + * + * Problems shown up as HyperZ glitches, see: + * https://bugs.freedesktop.org/show_bug.cgi?id=110897 + * + * Delegating initialization to r300 code seems to work + * and result in proper pipe numbers. Is this correct ? + */ + r300_gpu_init(rdev); } static void rs400_mc_init(struct radeon_device *rdev) -- 2.21.0