Skip to content

Commit 29ffeb7

Browse files
prenexalexdeucher
authored andcommitted
drm/radeon: 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. Closes: https://bugs.freedesktop.org/show_bug.cgi?id=110897 Reviewed-by: Marek Olšák <marek.olsak@amd.com> Signed-off-by: Richard Thier <u9vata@gmail.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> (cherry picked from commit 044e59a) Cc: stable@vger.kernel.org
1 parent fd617ea commit 29ffeb7

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

drivers/gpu/drm/radeon/r300.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,8 @@ int r300_mc_wait_for_idle(struct radeon_device *rdev)
359359
return -1;
360360
}
361361

362-
static void r300_gpu_init(struct radeon_device *rdev)
362+
/* rs400_gpu_init also calls this! */
363+
void r300_gpu_init(struct radeon_device *rdev)
363364
{
364365
uint32_t gb_tile_config, tmp;
365366

drivers/gpu/drm/radeon/radeon_asic.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ void r200_set_safe_registers(struct radeon_device *rdev);
165165
*/
166166
extern int r300_init(struct radeon_device *rdev);
167167
extern void r300_fini(struct radeon_device *rdev);
168+
extern void r300_gpu_init(struct radeon_device *rdev);
168169
extern int r300_suspend(struct radeon_device *rdev);
169170
extern int r300_resume(struct radeon_device *rdev);
170171
extern int r300_asic_reset(struct radeon_device *rdev, bool hard);

drivers/gpu/drm/radeon/rs400.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,22 @@ int rs400_mc_wait_for_idle(struct radeon_device *rdev)
256256

257257
static void rs400_gpu_init(struct radeon_device *rdev)
258258
{
259-
/* FIXME: is this correct ? */
260-
r420_pipes_init(rdev);
259+
/* Earlier code was calling r420_pipes_init and then
260+
* rs400_mc_wait_for_idle(rdev). The problem is that
261+
* at least on my Mobility Radeon Xpress 200M RC410 card
262+
* that ends up in this code path ends up num_gb_pipes == 3
263+
* while the card seems to have only one pipe. With the
264+
* r420 pipe initialization method.
265+
*
266+
* Problems shown up as HyperZ glitches, see:
267+
* https://bugs.freedesktop.org/show_bug.cgi?id=110897
268+
*
269+
* Delegating initialization to r300 code seems to work
270+
* and results in proper pipe numbers. The rs400 cards
271+
* are said to be not r400, but r300 kind of cards.
272+
*/
273+
r300_gpu_init(rdev);
274+
261275
if (rs400_mc_wait_for_idle(rdev)) {
262276
pr_warn("rs400: Failed to wait MC idle while programming pipes. Bad things might happen. %08x\n",
263277
RREG32(RADEON_MC_STATUS));

0 commit comments

Comments
 (0)