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