<div dir="ltr">Reviewed-by: Marek Olšák <<a href="mailto:marek.olsak@amd.com">marek.olsak@amd.com</a>></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Tue, Jun 18, 2019 at 3:19 AM Richard Thier <<a href="mailto:u9vata@gmail.com">u9vata@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">num_gb_pipes was set to a wrong value using r420_pipe_config<br>
<br>
This have lead to HyperZ glitches on fast Z clearing.<br>
<br>
See: <a href="https://bugs.freedesktop.org/show_bug.cgi?id=110897" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=110897</a><br>
<br>
Signed-off-by: Richard Thier <<a href="mailto:u9vata@gmail.com" target="_blank">u9vata@gmail.com</a>><br>
---<br>
 drivers/gpu/drm/radeon/r300.c  |  3 ++-<br>
 drivers/gpu/drm/radeon/rs400.c | 21 +++++++++++++++++++--<br>
 2 files changed, 21 insertions(+), 3 deletions(-)<br>
<br>
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c<br>
index 652126f..6724c15 100644<br>
--- a/drivers/gpu/drm/radeon/r300.c<br>
+++ b/drivers/gpu/drm/radeon/r300.c<br>
@@ -355,7 +355,8 @@ int r300_mc_wait_for_idle(struct radeon_device *rdev)<br>
        return -1;<br>
 }<br>
<br>
-static void r300_gpu_init(struct radeon_device *rdev)<br>
+/* rs400_gpu_init also calls this! */<br>
+void r300_gpu_init(struct radeon_device *rdev)<br>
 {<br>
        uint32_t gb_tile_config, tmp;<br>
<br>
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c<br>
index 4121209..4117572 100644<br>
--- a/drivers/gpu/drm/radeon/rs400.c<br>
+++ b/drivers/gpu/drm/radeon/rs400.c<br>
@@ -32,6 +32,9 @@<br>
 #include "radeon_asic.h"<br>
 #include "rs400d.h"<br>
<br>
+/* Needed for rs400_gpu_init that forwards to the r300 one */<br>
+void r300_gpu_init(struct radeon_device *rdev);<br>
+<br>
 /* This files gather functions specifics to : rs400,rs480 */<br>
 static int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev);<br>
<br>
@@ -252,8 +255,22 @@ int rs400_mc_wait_for_idle(struct radeon_device *rdev)<br>
<br>
 static void rs400_gpu_init(struct radeon_device *rdev)<br>
 {<br>
-       /* FIXME: is this correct ? */<br>
-       r420_pipes_init(rdev);<br>
+       /* Earlier code was calling r420_pipes_init and then<br>
+        * rs400_mc_wait_for_idle(rdev). The problem is that <br>
+        * at least on my Mobility Radeon Xpress 200M RC410 card<br>
+        * that ends up in this code path ends up num_gb_pipes == 3<br>
+        * while the card seems to have only one pipe. With the<br>
+        * r420 pipe initialization method.<br>
+        *<br>
+        * Problems shown up as HyperZ glitches, see:<br>
+        * <a href="https://bugs.freedesktop.org/show_bug.cgi?id=110897" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=110897</a><br>
+        *<br>
+        * Delegating initialization to r300 code seems to work<br>
+        * and results in proper pipe numbers. The rs400 cards <br>
+        * are said to be not r400, but r300 kind of cards.<br>
+        */<br>
+       r300_gpu_init(rdev);<br>
+<br>
        if (rs400_mc_wait_for_idle(rdev)) {<br>
                pr_warn("rs400: Failed to wait MC idle while programming pipes. Bad things might happen. %08x\n",<br>
                        RREG32(RADEON_MC_STATUS));<br>
-- <br>
2.21.0<br>
<br>
_______________________________________________<br>
amd-gfx mailing list<br>
<a href="mailto:amd-gfx@lists.freedesktop.org" target="_blank">amd-gfx@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/amd-gfx" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/amd-gfx</a></blockquote></div>