drm/nouveau/device: provide a way for devinit to mark engines as disabled
authorIlia Mirkin <imirkin@alum.mit.edu>
Fri, 10 Jan 2014 02:19:11 +0000 (21:19 -0500)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 23 Jan 2014 03:39:13 +0000 (13:39 +1000)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/core/engine.c
drivers/gpu/drm/nouveau/core/include/core/device.h

index c8bed4a..1f6954a 100644 (file)
@@ -42,11 +42,24 @@ nouveau_engine_create_(struct nouveau_object *parent,
        if (ret)
                return ret;
 
-       if ( parent &&
-           !nouveau_boolopt(nv_device(parent)->cfgopt, iname, enable)) {
-               if (!enable)
-                       nv_warn(engine, "disabled, %s=1 to enable\n", iname);
-               return -ENODEV;
+       if (parent) {
+               struct nouveau_device *device = nv_device(parent);
+               int engidx = nv_engidx(nv_object(engine));
+
+               if (device->disable_mask & (1ULL << engidx)) {
+                       if (!nouveau_boolopt(device->cfgopt, iname, false)) {
+                               nv_debug(engine, "engine disabled by hw/fw\n");
+                               return -ENODEV;
+                       }
+
+                       nv_warn(engine, "ignoring hw/fw engine disable\n");
+               }
+
+               if (!nouveau_boolopt(device->cfgopt, iname, enable)) {
+                       if (!enable)
+                               nv_warn(engine, "disabled, %s=1 to enable\n", iname);
+                       return -ENODEV;
+               }
        }
 
        INIT_LIST_HEAD(&engine->contexts);
index 24809c1..7b8ea22 100644 (file)
@@ -71,6 +71,7 @@ struct nouveau_device {
        const char *dbgopt;
        const char *name;
        const char *cname;
+       u64 disable_mask;
 
        enum {
                NV_04    = 0x04,