]> www.infradead.org Git - users/hch/misc.git/commitdiff
drm/radeon: Fix rs400_gpu_init for ATI mobility radeon Xpress 200M
authorRichard Thier <u9vata@gmail.com>
Mon, 17 Jun 2019 21:46:27 +0000 (23:46 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 5 Mar 2025 15:43:01 +0000 (10:43 -0500)
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>
drivers/gpu/drm/radeon/r300.c
drivers/gpu/drm/radeon/radeon_asic.h
drivers/gpu/drm/radeon/rs400.c

index 05c13102a8cb8fe0534fc2176c2c08deb491e01a..d22889fbfa9c83f393331724eb179ec216bb507f 100644 (file)
@@ -359,7 +359,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;
 
index 1e00f6b99f94b619222b8ff0d149b8a0f5c255c4..8f5e07834fcc60778211a33a36af4180a2c567e6 100644 (file)
@@ -165,6 +165,7 @@ void r200_set_safe_registers(struct radeon_device *rdev);
  */
 extern int r300_init(struct radeon_device *rdev);
 extern void r300_fini(struct radeon_device *rdev);
+extern void r300_gpu_init(struct radeon_device *rdev);
 extern int r300_suspend(struct radeon_device *rdev);
 extern int r300_resume(struct radeon_device *rdev);
 extern int r300_asic_reset(struct radeon_device *rdev, bool hard);
index d6c18fd740ec6a2c3194d79a3e5c7130c6a397ae..13cd0a688a65cb60fe2146c06ce7dcfe7fabaf5f 100644 (file)
@@ -256,8 +256,22 @@ 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);
+       /* Earlier code was calling r420_pipes_init and then
+        * rs400_mc_wait_for_idle(rdev). The problem 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. With the
+        * r420 pipe initialization method.
+        *
+        * 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 results in proper pipe numbers. The rs400 cards
+        * are said to be not r400, but r300 kind of cards.
+        */
+       r300_gpu_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));