return -ENODEV;
 
        ret = nouveau_namedb_create_(NULL, NULL, &nouveau_client_oclass,
-                                    NV_CLIENT_CLASS, nouveau_device_sclass,
-                                    0, length, pobject);
+                                    NV_CLIENT_CLASS, NULL,
+                                    (1ULL << NVDEV_ENGINE_DEVICE),
+                                    length, pobject);
        client = *pobject;
        if (ret)
                return ret;
 
 
 #include <core/object.h>
 #include <core/parent.h>
+#include <core/client.h>
 
 int
 nouveau_parent_sclass(struct nouveau_object *parent, u16 handle,
        while (mask) {
                int i = ffsll(mask) - 1;
 
-               if ((engine = nouveau_engine(parent, i))) {
+               if (nv_iclass(parent, NV_CLIENT_CLASS))
+                       engine = nv_engine(nv_client(parent)->device);
+               else
+                       engine = nouveau_engine(parent, i);
+
+               if (engine) {
                        oclass = engine->sclass;
                        while (oclass->ofuncs) {
                                if ((oclass->handle & 0xffff) == handle) {
 
 /******************************************************************************
  * nouveau_device: engine functions
  *****************************************************************************/
-struct nouveau_oclass
+static struct nouveau_oclass
 nouveau_device_sclass[] = {
        { 0x0080, &nouveau_devobj_ofuncs },
        {}
        device->name = sname;
 
        nv_subdev(device)->debug = nouveau_dbgopt(device->dbgopt, "DEVICE");
+       nv_engine(device)->sclass = nouveau_device_sclass;
        list_add(&device->head, &nv_devices);
 done:
        mutex_unlock(&nv_devices_mutex);
 
 int nvc0_identify(struct nouveau_device *);
 int nve0_identify(struct nouveau_device *);
 
-extern struct nouveau_oclass nouveau_device_sclass[];
 struct nouveau_device *nouveau_device_find(u64 name);
 
 #endif