Custom code is no longer needed here.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
 
        struct nvkm_client_notify *notify[16];
        struct rb_root objroot;
-       struct rb_root dmaroot;
 
        bool super;
        void *data;
 
        u32 access;
        u64 start;
        u64 limit;
-
-       struct rb_node rb;
-       u64 handle; /*XXX HANDLE MERGE */
 };
 
 struct nvkm_dma {
        struct nvkm_engine engine;
 };
 
-struct nvkm_dmaobj *
-nvkm_dma_search(struct nvkm_dma *, struct nvkm_client *, u64 object);
+struct nvkm_dmaobj *nvkm_dmaobj_search(struct nvkm_client *, u64 object);
 
 int nv04_dma_new(struct nvkm_device *, int, struct nvkm_dma **);
 int nv50_dma_new(struct nvkm_device *, int, struct nvkm_dma **);
 
        client->device = device;
        client->debug = nvkm_dbgopt(dbg, "CLIENT");
        client->objroot = RB_ROOT;
-       client->dmaroot = RB_ROOT;
        return 0;
 }
 
                    const struct nvkm_oclass *oclass,
                    struct nvkm_object **pobject)
 {
-       struct nvkm_device *device = root->disp->base.engine.subdev.device;
        struct nvkm_client *client = oclass->client;
        struct nvkm_dmaobj *dmaobj;
        struct nv50_disp_dmac *chan;
        if (ret)
                return ret;
 
-       dmaobj = nvkm_dma_search(device->dma, client, push);
-       if (!dmaobj)
-               return -ENOENT;
+       dmaobj = nvkm_dmaobj_search(client, push);
+       if (IS_ERR(dmaobj))
+               return PTR_ERR(dmaobj);
 
        if (dmaobj->limit - dmaobj->start != 0xfff)
                return -EINVAL;
 
 
 #include <nvif/class.h>
 
-struct nvkm_dmaobj *
-nvkm_dma_search(struct nvkm_dma *dma, struct nvkm_client *client, u64 object)
-{
-       struct rb_node *node = client->dmaroot.rb_node;
-       while (node) {
-               struct nvkm_dmaobj *dmaobj =
-                       rb_entry(node, typeof(*dmaobj), rb);
-               if (object < dmaobj->handle)
-                       node = node->rb_left;
-               else
-               if (object > dmaobj->handle)
-                       node = node->rb_right;
-               else
-                       return dmaobj;
-       }
-       return NULL;
-}
-
 static int
 nvkm_dma_oclass_new(struct nvkm_device *device,
                    const struct nvkm_oclass *oclass, void *data, u32 size,
 {
        struct nvkm_dma *dma = nvkm_dma(oclass->engine);
        struct nvkm_dmaobj *dmaobj = NULL;
-       struct nvkm_client *client = oclass->client;
-       struct rb_node **ptr = &client->dmaroot.rb_node;
-       struct rb_node *parent = NULL;
        int ret;
 
        ret = dma->func->class_new(dma, oclass, data, size, &dmaobj);
        if (dmaobj)
                *pobject = &dmaobj->object;
-       if (ret)
-               return ret;
-
-       dmaobj->handle = oclass->object;
-
-       while (*ptr) {
-               struct nvkm_dmaobj *obj = rb_entry(*ptr, typeof(*obj), rb);
-               parent = *ptr;
-               if (dmaobj->handle < obj->handle)
-                       ptr = &parent->rb_left;
-               else
-               if (dmaobj->handle > obj->handle)
-                       ptr = &parent->rb_right;
-               else
-                       return -EEXIST;
-       }
-
-       rb_link_node(&dmaobj->rb, parent, ptr);
-       rb_insert_color(&dmaobj->rb, &client->dmaroot);
-       return 0;
+       return ret;
 }
 
 static const struct nvkm_device_oclass
 
 #include <nvif/cl0002.h>
 #include <nvif/unpack.h>
 
+static const struct nvkm_object_func nvkm_dmaobj_func;
+struct nvkm_dmaobj *
+nvkm_dmaobj_search(struct nvkm_client *client, u64 handle)
+{
+       struct nvkm_object *object;
+
+       object = nvkm_object_search(client, handle, &nvkm_dmaobj_func);
+       if (IS_ERR(object))
+               return (void *)object;
+
+       return nvkm_dmaobj(object);
+}
+
 static int
 nvkm_dmaobj_bind(struct nvkm_object *base, struct nvkm_gpuobj *gpuobj,
                 int align, struct nvkm_gpuobj **pgpuobj)
 static void *
 nvkm_dmaobj_dtor(struct nvkm_object *base)
 {
-       struct nvkm_dmaobj *dmaobj = nvkm_dmaobj(base);
-       if (!RB_EMPTY_NODE(&dmaobj->rb))
-               rb_erase(&dmaobj->rb, &dmaobj->object.client->dmaroot);
-       return dmaobj;
+       return nvkm_dmaobj(base);
 }
 
 static const struct nvkm_object_func
        nvkm_object_ctor(&nvkm_dmaobj_func, oclass, &dmaobj->object);
        dmaobj->func = func;
        dmaobj->dma = dma;
-       RB_CLEAR_NODE(&dmaobj->rb);
 
        nvif_ioctl(parent, "create dma size %d\n", *psize);
        if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
 
 
        /* allocate push buffer ctxdma instance */
        if (push) {
-               dmaobj = nvkm_dma_search(device->dma, oclass->client, push);
-               if (!dmaobj)
-                       return -ENOENT;
+               dmaobj = nvkm_dmaobj_search(client, push);
+               if (IS_ERR(dmaobj))
+                       return PTR_ERR(dmaobj);
 
                ret = nvkm_object_bind(&dmaobj->object, chan->inst, -16,
                                       &chan->push);