These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / gpu / drm / nouveau / nvkm / engine / dma / user.c
  *
  * Authors: Ben Skeggs
  */
-#include "priv.h"
+#include "user.h"
 
 #include <core/client.h>
-#include <core/device.h>
+#include <core/gpuobj.h>
 #include <subdev/fb.h>
 #include <subdev/instmem.h>
 
 #include <nvif/unpack.h>
 
 static int
-nvkm_dmaobj_bind(struct nvkm_dmaobj *dmaobj, struct nvkm_object *parent,
-                struct nvkm_gpuobj **pgpuobj)
+nvkm_dmaobj_bind(struct nvkm_object *base, struct nvkm_gpuobj *gpuobj,
+                int align, struct nvkm_gpuobj **pgpuobj)
 {
-       const struct nvkm_dmaeng_impl *impl = (void *)
-               nv_oclass(nv_object(dmaobj)->engine);
-       int ret = 0;
-
-       if (nv_object(dmaobj) == parent) { /* ctor bind */
-               if (nv_mclass(parent->parent) == NV_DEVICE) {
-                       /* delayed, or no, binding */
-                       return 0;
-               }
-               ret = impl->bind(dmaobj, parent, pgpuobj);
-               if (ret == 0)
-                       nvkm_object_ref(NULL, &parent);
-               return ret;
-       }
+       struct nvkm_dmaobj *dmaobj = nvkm_dmaobj(base);
+       return dmaobj->func->bind(dmaobj, gpuobj, align, pgpuobj);
+}
 
-       return impl->bind(dmaobj, parent, 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;
 }
 
+static const struct nvkm_object_func
+nvkm_dmaobj_func = {
+       .dtor = nvkm_dmaobj_dtor,
+       .bind = nvkm_dmaobj_bind,
+};
+
 int
-nvkm_dmaobj_create_(struct nvkm_object *parent,
-                   struct nvkm_object *engine,
-                   struct nvkm_oclass *oclass, void **pdata, u32 *psize,
-                   int length, void **pobject)
+nvkm_dmaobj_ctor(const struct nvkm_dmaobj_func *func, struct nvkm_dma *dma,
+                const struct nvkm_oclass *oclass, void **pdata, u32 *psize,
+                struct nvkm_dmaobj *dmaobj)
 {
        union {
                struct nv_dma_v0 v0;
        } *args = *pdata;
-       struct nvkm_instmem *instmem = nvkm_instmem(parent);
-       struct nvkm_client *client = nvkm_client(parent);
-       struct nvkm_device *device = nv_device(parent);
-       struct nvkm_fb *pfb = nvkm_fb(parent);
-       struct nvkm_dmaobj *dmaobj;
+       struct nvkm_device *device = dma->engine.subdev.device;
+       struct nvkm_client *client = oclass->client;
+       struct nvkm_object *parent = oclass->parent;
+       struct nvkm_instmem *instmem = device->imem;
+       struct nvkm_fb *fb = device->fb;
        void *data = *pdata;
        u32 size = *psize;
        int ret;
 
-       ret = nvkm_object_create_(parent, engine, oclass, 0, length, pobject);
-       dmaobj = *pobject;
-       if (ret)
-               return ret;
+       nvkm_object_ctor(&nvkm_dmaobj_func, oclass, &dmaobj->object);
+       dmaobj->func = func;
+       dmaobj->dma = dma;
+       RB_CLEAR_NODE(&dmaobj->rb);
 
-       nv_ioctl(parent, "create dma size %d\n", *psize);
+       nvif_ioctl(parent, "create dma size %d\n", *psize);
        if (nvif_unpack(args->v0, 0, 0, true)) {
-               nv_ioctl(parent, "create dma vers %d target %d access %d "
-                                "start %016llx limit %016llx\n",
-                        args->v0.version, args->v0.target, args->v0.access,
-                        args->v0.start, args->v0.limit);
+               nvif_ioctl(parent, "create dma vers %d target %d access %d "
+                                  "start %016llx limit %016llx\n",
+                          args->v0.version, args->v0.target, args->v0.access,
+                          args->v0.start, args->v0.limit);
                dmaobj->target = args->v0.target;
                dmaobj->access = args->v0.access;
                dmaobj->start  = args->v0.start;
@@ -101,7 +101,7 @@ nvkm_dmaobj_create_(struct nvkm_object *parent,
                break;
        case NV_DMA_V0_TARGET_VRAM:
                if (!client->super) {
-                       if (dmaobj->limit >= pfb->ram->size - instmem->reserved)
+                       if (dmaobj->limit >= fb->ram->size - instmem->reserved)
                                return -EACCES;
                        if (device->card_type >= NV_50)
                                return -EACCES;
@@ -142,23 +142,3 @@ nvkm_dmaobj_create_(struct nvkm_object *parent,
 
        return ret;
 }
-
-int
-_nvkm_dmaeng_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
-                 struct nvkm_oclass *oclass, void *data, u32 size,
-                 struct nvkm_object **pobject)
-{
-       const struct nvkm_dmaeng_impl *impl = (void *)oclass;
-       struct nvkm_dmaeng *dmaeng;
-       int ret;
-
-       ret = nvkm_engine_create(parent, engine, oclass, true, "DMAOBJ",
-                                "dmaobj", &dmaeng);
-       *pobject = nv_object(dmaeng);
-       if (ret)
-               return ret;
-
-       nv_engine(dmaeng)->sclass = impl->sclass;
-       dmaeng->bind = nvkm_dmaobj_bind;
-       return 0;
-}