OSDN Git Service

drm/nouveau: default to noaccel on 0xc1/0xc8/0xce for now
authorBen Skeggs <bskeggs@redhat.com>
Wed, 25 May 2011 04:48:50 +0000 (14:48 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 23 Jun 2011 05:57:28 +0000 (15:57 +1000)
Until we know these should work properly, would much rather default to
noaccel than risk giving people corruption/hangs out of the box..

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_drv.c
drivers/gpu/drm/nouveau/nouveau_drv.h
drivers/gpu/drm/nouveau/nouveau_state.c

index 02c6f37..bdee1a6 100644 (file)
@@ -73,7 +73,7 @@ int nouveau_ignorelid = 0;
 module_param_named(ignorelid, nouveau_ignorelid, int, 0400);
 
 MODULE_PARM_DESC(noaccel, "Disable all acceleration");
-int nouveau_noaccel = 0;
+int nouveau_noaccel = -1;
 module_param_named(noaccel, nouveau_noaccel, int, 0400);
 
 MODULE_PARM_DESC(nofbaccel, "Disable fbcon acceleration");
index 9c56331..276fac7 100644 (file)
@@ -608,6 +608,7 @@ enum nouveau_card_type {
 
 struct drm_nouveau_private {
        struct drm_device *dev;
+       bool noaccel;
 
        /* the card type, takes NV_* as values */
        enum nouveau_card_type card_type;
index dd6f305..f65811c 100644 (file)
@@ -565,7 +565,7 @@ nouveau_card_init(struct drm_device *dev)
        if (ret)
                goto out_timer;
 
-       if (!nouveau_noaccel) {
+       if (!dev_priv->noaccel) {
                switch (dev_priv->card_type) {
                case NV_04:
                        nv04_graph_create(dev);
@@ -677,10 +677,10 @@ out_vblank:
        drm_vblank_cleanup(dev);
        engine->display.destroy(dev);
 out_fifo:
-       if (!nouveau_noaccel)
+       if (!dev_priv->noaccel)
                engine->fifo.takedown(dev);
 out_engine:
-       if (!nouveau_noaccel) {
+       if (!dev_priv->noaccel) {
                for (e = e - 1; e >= 0; e--) {
                        if (!dev_priv->eng[e])
                                continue;
@@ -725,7 +725,7 @@ static void nouveau_card_takedown(struct drm_device *dev)
                nouveau_channel_put_unlocked(&dev_priv->channel);
        }
 
-       if (!nouveau_noaccel) {
+       if (!dev_priv->noaccel) {
                engine->fifo.takedown(dev);
                for (e = NVOBJ_ENGINE_NR - 1; e >= 0; e--) {
                        if (dev_priv->eng[e]) {
@@ -936,6 +936,24 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
        NV_INFO(dev, "Detected an NV%2x generation card (0x%08x)\n",
                dev_priv->card_type, reg0);
 
+       /* Determine whether we'll attempt acceleration or not, some
+        * cards are disabled by default here due to them being known
+        * non-functional, or never been tested due to lack of hw.
+        */
+       dev_priv->noaccel = !!nouveau_noaccel;
+       if (nouveau_noaccel == -1) {
+               switch (dev_priv->chipset) {
+               case 0xc1: /* known broken */
+               case 0xc8: /* never tested */
+               case 0xce: /* never tested */
+                       dev_priv->noaccel = true;
+                       break;
+               default:
+                       dev_priv->noaccel = false;
+                       break;
+               }
+       }
+
        ret = nouveau_remove_conflicting_drivers(dev);
        if (ret)
                goto err_mmio;