68d0d67
Bugzilla: N/A
68d0d67
Upstream-status: Replaced by http://lists.freedesktop.org/archives/dri-devel/2013-December/050290.html in 3.14
68d0d67
6f1d3b1
From b67e0a6a7409f9c1a12e573fb7d8d80ee455b103 Mon Sep 17 00:00:00 2001
6f1d3b1
From: Adam Jackson <ajax@redhat.com>
6f1d3b1
Date: Mon, 17 Jun 2013 09:59:34 -0400
6f1d3b1
Subject: [PATCH] drm/radeon: Disable writeback by default on ppc
6f1d3b1
6f1d3b1
At least on an IBM Power 720, this check passes, but several piglit
6f1d3b1
tests will reliably trigger GPU resets due to the ring buffer pointers
6f1d3b1
not being updated.  There's probably a better way to limit this to just
6f1d3b1
affected machines though.
6f1d3b1
6f1d3b1
Signed-off-by: Adam Jackson <ajax@redhat.com>
6f1d3b1
---
6f1d3b1
 drivers/gpu/drm/radeon/r600_cp.c       | 7 +++++++
6f1d3b1
 drivers/gpu/drm/radeon/radeon_cp.c     | 7 +++++++
6f1d3b1
 drivers/gpu/drm/radeon/radeon_device.c | 4 ++--
6f1d3b1
 drivers/gpu/drm/radeon/radeon_drv.c    | 2 +-
6f1d3b1
 4 files changed, 17 insertions(+), 3 deletions(-)
6f1d3b1
6f1d3b1
diff --git a/drivers/gpu/drm/radeon/r600_cp.c b/drivers/gpu/drm/radeon/r600_cp.c
6f1d3b1
index 1c51c08..ef28532 100644
6f1d3b1
--- a/drivers/gpu/drm/radeon/r600_cp.c
6f1d3b1
+++ b/drivers/gpu/drm/radeon/r600_cp.c
6f1d3b1
@@ -552,6 +552,13 @@ static void r600_test_writeback(drm_radeon_private_t *dev_priv)
6f1d3b1
 		dev_priv->writeback_works = 0;
6f1d3b1
 		DRM_INFO("writeback test failed\n");
6f1d3b1
 	}
6f1d3b1
+#if defined(__ppc__) || defined(__ppc64__)
6f1d3b1
+	/* the test might succeed on ppc, but it's usually not reliable */
6f1d3b1
+	if (radeon_no_wb == -1) {
6f1d3b1
+		radeon_no_wb = 1;
6f1d3b1
+		DRM_INFO("not trusting writeback test due to arch quirk\n");
6f1d3b1
+	}
6f1d3b1
+#endif
6f1d3b1
 	if (radeon_no_wb == 1) {
6f1d3b1
 		dev_priv->writeback_works = 0;
6f1d3b1
 		DRM_INFO("writeback forced off\n");
6f1d3b1
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c
6f1d3b1
index efc4f64..a967b33 100644
6f1d3b1
--- a/drivers/gpu/drm/radeon/radeon_cp.c
6f1d3b1
+++ b/drivers/gpu/drm/radeon/radeon_cp.c
6f1d3b1
@@ -892,6 +892,13 @@ static void radeon_test_writeback(drm_radeon_private_t * dev_priv)
6f1d3b1
 		dev_priv->writeback_works = 0;
6f1d3b1
 		DRM_INFO("writeback test failed\n");
6f1d3b1
 	}
6f1d3b1
+#if defined(__ppc__) || defined(__ppc64__)
6f1d3b1
+	/* the test might succeed on ppc, but it's usually not reliable */
6f1d3b1
+	if (radeon_no_wb == -1) {
6f1d3b1
+		radeon_no_wb = 1;
6f1d3b1
+		DRM_INFO("not trusting writeback test due to arch quirk\n");
6f1d3b1
+	}
6f1d3b1
+#endif
6f1d3b1
 	if (radeon_no_wb == 1) {
6f1d3b1
 		dev_priv->writeback_works = 0;
6f1d3b1
 		DRM_INFO("writeback forced off\n");
6f1d3b1
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
6f1d3b1
index 1899738..524046e 100644
6f1d3b1
--- a/drivers/gpu/drm/radeon/radeon_device.c
6f1d3b1
+++ b/drivers/gpu/drm/radeon/radeon_device.c
6f1d3b1
@@ -322,8 +322,8 @@ int radeon_wb_init(struct radeon_device *rdev)
6f1d3b1
 	/* disable event_write fences */
6f1d3b1
 	rdev->wb.use_event = false;
6f1d3b1
 	/* disabled via module param */
6f1d3b1
-	if (radeon_no_wb == 1) {
6f1d3b1
-		rdev->wb.enabled = false;
6f1d3b1
+	if (radeon_no_wb != -1) {
6f1d3b1
+		rdev->wb.enabled = !!radeon_no_wb;
6f1d3b1
 	} else {
6f1d3b1
 		if (rdev->flags & RADEON_IS_AGP) {
6f1d3b1
 			/* often unreliable on AGP */
6f1d3b1
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
6f1d3b1
index 094e7e5..04809d4 100644
6f1d3b1
--- a/drivers/gpu/drm/radeon/radeon_drv.c
6f1d3b1
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
6f1d3b1
@@ -146,7 +146,7 @@ static inline void radeon_register_atpx_handler(void) {}
6f1d3b1
 static inline void radeon_unregister_atpx_handler(void) {}
6f1d3b1
 #endif
6f1d3b1
 
6f1d3b1
-int radeon_no_wb;
6f1d3b1
+int radeon_no_wb = -1;
6f1d3b1
 int radeon_modeset = -1;
6f1d3b1
 int radeon_dynclks = -1;
6f1d3b1
 int radeon_r4xx_atom = 0;
6f1d3b1
-- 
6f1d3b1
1.8.2.1
6f1d3b1