|
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
|