struct nv_device_info_v0 info;
 };
 
-int  nvif_device_init(struct nvif_object *, u32 handle, u32 oclass, void *, u32,
+int  nvif_device_init(struct nvif_object *, u32 handle, s32 oclass, void *, u32,
                      struct nvif_device *);
 void nvif_device_fini(struct nvif_device *);
 u64  nvif_device_time(struct nvif_device *);
 
        __u8  version;
        __u8  count;
        __u8  pad02[6];
-       __u32 oclass[];
+       __s32 oclass[];
 };
 
 struct nvif_ioctl_new_v0 {
        __u64 object;
        __u32 handle;
 /* these class numbers are made up by us, and not nvidia-assigned */
-#define NVIF_IOCTL_NEW_V0_PERFMON                                    0x0000ffff
-#define NVIF_IOCTL_NEW_V0_PERFDOM                                    0x0000fffe
-#define NVIF_IOCTL_NEW_V0_CONTROL                                    0x0000fffd
-       __u32 oclass;
+#define NVIF_IOCTL_NEW_V0_CONTROL                                            -1
+#define NVIF_IOCTL_NEW_V0_PERFMON                                            -2
+#define NVIF_IOCTL_NEW_V0_PERFDOM                                            -3
+       __s32 oclass;
        __u8  data[];           /* class data (class.h) */
 };
 
 
 struct nvif_object {
        struct nvif_client *client;
        u32 handle;
-       u32 oclass;
+       s32 oclass;
        void *priv; /*XXX: hack */
        struct {
                void __iomem *ptr;
        } map;
 };
 
-int  nvif_object_init(struct nvif_object *, u32 handle, u32 oclass, void *, u32,
+int  nvif_object_init(struct nvif_object *, u32 handle, s32 oclass, void *, u32,
                      struct nvif_object *);
 void nvif_object_fini(struct nvif_object *);
 int  nvif_object_ioctl(struct nvif_object *, void *, u32, void **);
-int  nvif_object_sclass(struct nvif_object *, u32 *, int);
+int  nvif_object_sclass(struct nvif_object *, s32 *, int);
 u32  nvif_object_rd(struct nvif_object *, int, u64);
 void nvif_object_wr(struct nvif_object *, int, u64, u32);
 int  nvif_object_mthd(struct nvif_object *, u32, void *, u32);
 
 void nvkm_client_remove(struct nvkm_client *, struct nvkm_handle *);
 struct nvkm_handle *nvkm_client_search(struct nvkm_client *, u64 handle);
 
-static inline struct nvkm_client *
-nv_client(void *obj)
-{
-#if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
-       BUG_ON(!nv_iclass(obj, NV_CLIENT_CLASS));
-#endif
-       return obj;
-}
-
 static inline struct nvkm_client *
 nvkm_client(void *obj)
 {
        struct nvkm_object *client = nv_object(obj);
-       while (client && !(nv_iclass(client, NV_CLIENT_CLASS)))
+       while (client && client->parent)
                client = client->parent;
        return (void *)client;
 }
 
 /* Don't allocate dynamically, because lockdep needs lock_class_keys to be in
  * ".data". */
 struct nvkm_oclass {
-       u32 handle;
+       s32 handle;
        struct nvkm_ofuncs * const ofuncs;
        struct nvkm_omthds * const omthds;
        struct lock_class_key lock_class_key;
 
 #define _nvkm_parent_init nvkm_object_init
 #define _nvkm_parent_fini nvkm_object_fini
 
-int nvkm_parent_sclass(struct nvkm_object *, u16 handle,
+int nvkm_parent_sclass(struct nvkm_object *, s32 handle,
                       struct nvkm_object **pengine,
                       struct nvkm_oclass **poclass);
-int nvkm_parent_lclass(struct nvkm_object *, u32 *, int);
+int nvkm_parent_lclass(struct nvkm_object *, s32 *, int);
 #endif
 
        static const struct {
                const char *name;
                int engine;
-               u32 oclass;
+               s32 oclass;
                int (*exec)(struct nouveau_channel *,
                            struct ttm_buffer_object *,
                            struct ttm_mem_reg *, struct ttm_mem_reg *);
 
 {
        struct nvif_device *device = &drm->device;
        u32 arg0, arg1;
-       u32 sclass[16];
+       s32 sclass[16];
        int ret, i;
 
        if (nouveau_noaccel)
 
 
 static int
 nv50_chan_create(struct nvif_device *device, struct nvif_object *disp,
-                const u32 *oclass, u8 head, void *data, u32 size,
+                const s32 *oclass, u8 head, void *data, u32 size,
                 struct nv50_chan *chan)
 {
        const u32 handle = (oclass[0] << 16) | head;
-       u32 sclass[8];
+       s32 sclass[8];
        int ret, i;
 
        chan->device = device;
 
 static int
 nv50_pioc_create(struct nvif_device *device, struct nvif_object *disp,
-                const u32 *oclass, u8 head, void *data, u32 size,
+                const s32 *oclass, u8 head, void *data, u32 size,
                 struct nv50_pioc *pioc)
 {
        return nv50_chan_create(device, disp, oclass, head, data, size,
        struct nv50_disp_cursor_v0 args = {
                .head = head,
        };
-       static const u32 oclass[] = {
+       static const s32 oclass[] = {
                GK104_DISP_CURSOR,
                GF110_DISP_CURSOR,
                GT214_DISP_CURSOR,
        struct nv50_disp_cursor_v0 args = {
                .head = head,
        };
-       static const u32 oclass[] = {
+       static const s32 oclass[] = {
                GK104_DISP_OVERLAY,
                GF110_DISP_OVERLAY,
                GT214_DISP_OVERLAY,
 
 static int
 nv50_dmac_create(struct nvif_device *device, struct nvif_object *disp,
-                const u32 *oclass, u8 head, void *data, u32 size, u64 syncbuf,
+                const s32 *oclass, u8 head, void *data, u32 size, u64 syncbuf,
                 struct nv50_dmac *dmac)
 {
        struct nv50_disp_core_channel_dma_v0 *args = data;
        struct nv50_disp_core_channel_dma_v0 args = {
                .pushbuf = 0xb0007d00,
        };
-       static const u32 oclass[] = {
+       static const s32 oclass[] = {
                GM204_DISP_CORE_CHANNEL_DMA,
                GM107_DISP_CORE_CHANNEL_DMA,
                GK110_DISP_CORE_CHANNEL_DMA,
                .pushbuf = 0xb0007c00 | head,
                .head = head,
        };
-       static const u32 oclass[] = {
+       static const s32 oclass[] = {
                GK110_DISP_BASE_CHANNEL_DMA,
                GK104_DISP_BASE_CHANNEL_DMA,
                GF110_DISP_BASE_CHANNEL_DMA,
                .pushbuf = 0xb0007e00 | head,
                .head = head,
        };
-       static const u32 oclass[] = {
+       static const s32 oclass[] = {
                GK104_DISP_OVERLAY_CONTROL_DMA,
                GF110_DISP_OVERLAY_CONTROL_DMA,
                GT214_DISP_OVERLAY_CHANNEL_DMA,
 
 }
 
 int
-nvif_device_init(struct nvif_object *parent, u32 handle, u32 oclass,
+nvif_device_init(struct nvif_object *parent, u32 handle, s32 oclass,
                 void *data, u32 size, struct nvif_device *device)
 {
        int ret = nvif_object_init(parent, handle, oclass, data, size,
 
 }
 
 int
-nvif_object_sclass(struct nvif_object *object, u32 *oclass, int count)
+nvif_object_sclass(struct nvif_object *object, s32 *oclass, int count)
 {
        struct {
                struct nvif_ioctl_v0 ioctl;
        args->sclass.version = 0;
        args->sclass.count = count;
 
-       memcpy(args->sclass.oclass, oclass, size);
        ret = nvif_object_ioctl(object, args, sizeof(*args) + size, NULL);
        ret = ret ? ret : args->sclass.count;
        memcpy(oclass, args->sclass.oclass, size);
 }
 
 int
-nvif_object_init(struct nvif_object *parent, u32 handle, u32 oclass,
+nvif_object_init(struct nvif_object *parent, u32 handle, s32 oclass,
                 void *data, u32 size, struct nvif_object *object)
 {
        struct {
 
 #include <core/engine.h>
 
 int
-nvkm_parent_sclass(struct nvkm_object *parent, u16 handle,
+nvkm_parent_sclass(struct nvkm_object *parent, s32 handle,
                   struct nvkm_object **pengine,
                   struct nvkm_oclass **poclass)
 {
 }
 
 int
-nvkm_parent_lclass(struct nvkm_object *parent, u32 *lclass, int size)
+nvkm_parent_lclass(struct nvkm_object *parent, s32 *lclass, int size)
 {
        struct nvkm_oclass *sclass, *oclass;
        struct nvkm_engine *engine;