Ben Skeggs fbc4283
From 07a51882863d9e45b0715dcffbb66491adf2fb4e Mon Sep 17 00:00:00 2001
Ben Skeggs fbc4283
From: Ben Skeggs <bskeggs@redhat.com>
Ben Skeggs fbc4283
Date: Wed, 30 Jun 2010 13:34:05 +1000
Ben Skeggs fbc4283
Subject: [PATCH] drm/nouveau: disable acceleration on NVA3/NVA5/NVA8 by default
Ben Skeggs fbc4283
Ben Skeggs fbc4283
There's an GPU lockup problem for which the cause is currently unknown
Ben Skeggs fbc4283
on these chipsets.
Ben Skeggs fbc4283
Ben Skeggs fbc4283
Until it's resolved, it's better to leave the user with a working system
Ben Skeggs fbc4283
without acceleration than to have random lockups.
Ben Skeggs fbc4283
Ben Skeggs fbc4283
With this patch, acceleration will be off by default if a known problem
Ben Skeggs fbc4283
chipset is detected, but can be re-enabled with nouveau.noaccel=0 on
Ben Skeggs fbc4283
the kernel commandline.
Ben Skeggs fbc4283
Ben Skeggs fbc4283
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Ben Skeggs fbc4283
---
Ben Skeggs fbc4283
 drivers/gpu/drm/nouveau/nouveau_drv.c   |    2 +-
Ben Skeggs fbc4283
 drivers/gpu/drm/nouveau/nouveau_drv.h   |    1 +
Ben Skeggs fbc4283
 drivers/gpu/drm/nouveau/nouveau_state.c |   23 +++++++++++++++++++----
Ben Skeggs fbc4283
 3 files changed, 21 insertions(+), 5 deletions(-)
Ben Skeggs fbc4283
Ben Skeggs fbc4283
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.c b/drivers/gpu/drm/nouveau/nouveau_drv.c
Ben Skeggs fbc4283
index 946748a..9b69328 100644
Ben Skeggs fbc4283
--- a/drivers/gpu/drm/nouveau/nouveau_drv.c
Ben Skeggs fbc4283
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.c
Ben Skeggs fbc4283
@@ -72,7 +72,7 @@ int nouveau_ignorelid = 0;
Ben Skeggs fbc4283
 module_param_named(ignorelid, nouveau_ignorelid, int, 0400);
Ben Skeggs fbc4283
Ben Skeggs fbc4283
 MODULE_PARM_DESC(noaccel, "Disable all acceleration");
Ben Skeggs fbc4283
-int nouveau_noaccel = 0;
Ben Skeggs fbc4283
+int nouveau_noaccel = -1;
Ben Skeggs fbc4283
 module_param_named(noaccel, nouveau_noaccel, int, 0400);
Ben Skeggs fbc4283
Ben Skeggs fbc4283
 MODULE_PARM_DESC(nofbaccel, "Disable fbcon acceleration");
Ben Skeggs fbc4283
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
Ben Skeggs fbc4283
index 24b3d03..0cf1bee 100644
Ben Skeggs fbc4283
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
Ben Skeggs fbc4283
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
Ben Skeggs fbc4283
@@ -504,6 +504,7 @@ enum nouveau_card_type {
Ben Skeggs fbc4283
Ben Skeggs fbc4283
 struct drm_nouveau_private {
Ben Skeggs fbc4283
	struct drm_device *dev;
Ben Skeggs fbc4283
+	bool noaccel;
Ben Skeggs fbc4283
Ben Skeggs fbc4283
	/* the card type, takes NV_* as values */
Ben Skeggs fbc4283
	enum nouveau_card_type card_type;
Ben Skeggs fbc4283
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
Ben Skeggs fbc4283
index be85960..896f6ae 100644
Ben Skeggs fbc4283
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
Ben Skeggs fbc4283
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
Ben Skeggs fbc4283
@@ -563,7 +563,7 @@ nouveau_card_init(struct drm_device *dev)
Ben Skeggs fbc4283
	if (ret)
Ben Skeggs fbc4283
		goto out_timer;
Ben Skeggs fbc4283
Ben Skeggs fbc4283
-	if (nouveau_noaccel)
Ben Skeggs fbc4283
+	if (dev_priv->noaccel)
Ben Skeggs fbc4283
		engine->graph.accel_blocked = true;
Ben Skeggs fbc4283
	else {
Ben Skeggs fbc4283
		/* PGRAPH */
Ben Skeggs fbc4283
@@ -613,10 +613,10 @@ out_irq:
Ben Skeggs fbc4283
 out_display:
Ben Skeggs fbc4283
	engine->display.destroy(dev);
Ben Skeggs fbc4283
 out_fifo:
Ben Skeggs fbc4283
-	if (!nouveau_noaccel)
Ben Skeggs fbc4283
+	if (!dev_priv->noaccel)
Ben Skeggs fbc4283
		engine->fifo.takedown(dev);
Ben Skeggs fbc4283
 out_graph:
Ben Skeggs fbc4283
-	if (!nouveau_noaccel)
Ben Skeggs fbc4283
+	if (!dev_priv->noaccel)
Ben Skeggs fbc4283
		engine->graph.takedown(dev);
Ben Skeggs fbc4283
 out_fb:
Ben Skeggs fbc4283
	engine->fb.takedown(dev);
Ben Skeggs fbc4283
@@ -655,7 +655,7 @@ static void nouveau_card_takedown(struct drm_device *dev)
Ben Skeggs fbc4283
		dev_priv->channel = NULL;
Ben Skeggs fbc4283
	}
Ben Skeggs fbc4283
Ben Skeggs fbc4283
-	if (!nouveau_noaccel) {
Ben Skeggs fbc4283
+	if (!dev_priv->noaccel) {
Ben Skeggs fbc4283
		engine->fifo.takedown(dev);
Ben Skeggs fbc4283
		engine->graph.takedown(dev);
Ben Skeggs fbc4283
	}
Ben Skeggs fbc4283
@@ -861,6 +861,21 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
Ben Skeggs fbc4283
	if (ret)
Ben Skeggs fbc4283
		goto err_mmio;
Ben Skeggs fbc4283
Ben Skeggs fbc4283
+	if (nouveau_noaccel == -1) {
Ben Skeggs fbc4283
+		switch (dev_priv->chipset) {
Ben Skeggs fbc4283
+		case 0xa3:
Ben Skeggs fbc4283
+		case 0xa5:
Ben Skeggs fbc4283
+		case 0xa8:
Ben Skeggs fbc4283
+			dev_priv->noaccel = true;
Ben Skeggs fbc4283
+			break;
Ben Skeggs fbc4283
+		default:
Ben Skeggs fbc4283
+			dev_priv->noaccel = false;
Ben Skeggs fbc4283
+			break;
Ben Skeggs fbc4283
+		}
Ben Skeggs fbc4283
+	} else {
Ben Skeggs fbc4283
+		dev_priv->noaccel = (nouveau_noaccel != 0);
Ben Skeggs fbc4283
+	}
Ben Skeggs fbc4283
+
Ben Skeggs fbc4283
	/* Map PRAMIN BAR, or on older cards, the aperture withing BAR0 */
Ben Skeggs fbc4283
	if (dev_priv->card_type >= NV_40) {
Ben Skeggs fbc4283
		int ramin_bar = 2;
Ben Skeggs fbc4283
--
Ben Skeggs fbc4283
1.7.2.2