drm/nouveau/instmem: tidy up the object class definition
authorBen Skeggs <bskeggs@redhat.com>
Sun, 22 Dec 2013 15:08:00 +0000 (01:08 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 23 Jan 2014 03:39:10 +0000 (13:39 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/include/subdev/instmem.h
drivers/gpu/drm/nouveau/core/subdev/instmem/base.c
drivers/gpu/drm/nouveau/core/subdev/instmem/nv04.c
drivers/gpu/drm/nouveau/core/subdev/instmem/nv04.h
drivers/gpu/drm/nouveau/core/subdev/instmem/nv40.c
drivers/gpu/drm/nouveau/core/subdev/instmem/nv50.c
drivers/gpu/drm/nouveau/core/subdev/instmem/priv.h

index 7c20478064e343c95b4481623723b09ea5ca3dc3..c1df26f3230c17f8fe6ff2a270b95cbafb441c6f 100644 (file)
@@ -23,21 +23,6 @@ nv_memobj(void *obj)
        return obj;
 }
 
-#define nouveau_instobj_create(p,e,o,d)                                        \
-       nouveau_instobj_create_((p), (e), (o), sizeof(**d), (void **)d)
-#define nouveau_instobj_init(p)                                                \
-       nouveau_object_init(&(p)->base)
-#define nouveau_instobj_fini(p,s)                                              \
-       nouveau_object_fini(&(p)->base, (s))
-
-int  nouveau_instobj_create_(struct nouveau_object *, struct nouveau_object *,
-                            struct nouveau_oclass *, int, void **);
-void nouveau_instobj_destroy(struct nouveau_instobj *);
-
-void _nouveau_instobj_dtor(struct nouveau_object *);
-#define _nouveau_instobj_init nouveau_object_init
-#define _nouveau_instobj_fini nouveau_object_fini
-
 struct nouveau_instmem {
        struct nouveau_subdev base;
        struct list_head list;
index 5f5abf564adea93a8d95ef78f5da6991747f34b2..14706d9842ca6d1428298982e247f1887f11cff6 100644 (file)
 
 #include "priv.h"
 
+/******************************************************************************
+ * instmem object base implementation
+ *****************************************************************************/
+
+void
+_nouveau_instobj_dtor(struct nouveau_object *object)
+{
+       struct nouveau_instmem *imem = (void *)object->engine;
+       struct nouveau_instobj *iobj = (void *)object;
+
+       mutex_lock(&nv_subdev(imem)->mutex);
+       list_del(&iobj->head);
+       mutex_unlock(&nv_subdev(imem)->mutex);
+
+       return nouveau_object_destroy(&iobj->base);
+}
+
 int
 nouveau_instobj_create_(struct nouveau_object *parent,
                        struct nouveau_object *engine,
@@ -46,25 +63,6 @@ nouveau_instobj_create_(struct nouveau_object *parent,
        return 0;
 }
 
-void
-nouveau_instobj_destroy(struct nouveau_instobj *iobj)
-{
-       struct nouveau_subdev *subdev = nv_subdev(iobj->base.engine);
-
-       mutex_lock(&subdev->mutex);
-       list_del(&iobj->head);
-       mutex_unlock(&subdev->mutex);
-
-       return nouveau_object_destroy(&iobj->base);
-}
-
-void
-_nouveau_instobj_dtor(struct nouveau_object *object)
-{
-       struct nouveau_instobj *iobj = (void *)object;
-       return nouveau_instobj_destroy(iobj);
-}
-
 /******************************************************************************
  * instmem subdev base implementation
  *****************************************************************************/
@@ -76,14 +74,9 @@ nouveau_instmem_alloc(struct nouveau_instmem *imem,
 {
        struct nouveau_object *engine = nv_object(imem);
        struct nouveau_instmem_impl *impl = (void *)engine->oclass;
-       int ret;
-
-       ret = nouveau_object_ctor(parent, engine, impl->instobj,
-                                 (void *)(unsigned long)align, size, pobject);
-       if (ret)
-               return ret;
-
-       return 0;
+       struct nouveau_instobj_args args = { .size = size, .align = align };
+       return nouveau_object_ctor(parent, engine, impl->instobj, &args,
+                                  sizeof(args), pobject);
 }
 
 int
index 226809d2f29744925afb6f2b2f5c76abf13b4518..7b64befee48fbb5b30b306c980ae53bd077c3368 100644 (file)
 
 #include "nv04.h"
 
+/******************************************************************************
+ * instmem object implementation
+ *****************************************************************************/
+
+static u32
+nv04_instobj_rd32(struct nouveau_object *object, u64 addr)
+{
+       struct nv04_instobj_priv *node = (void *)object;
+       return nv_ro32(object->engine, node->mem->offset + addr);
+}
+
+static void
+nv04_instobj_wr32(struct nouveau_object *object, u64 addr, u32 data)
+{
+       struct nv04_instobj_priv *node = (void *)object;
+       nv_wo32(object->engine, node->mem->offset + addr, data);
+}
+
+static void
+nv04_instobj_dtor(struct nouveau_object *object)
+{
+       struct nv04_instmem_priv *priv = (void *)object->engine;
+       struct nv04_instobj_priv *node = (void *)object;
+       nouveau_mm_free(&priv->heap, &node->mem);
+       nouveau_instobj_destroy(&node->base);
+}
+
 static int
 nv04_instobj_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
                  struct nouveau_oclass *oclass, void *data, u32 size,
@@ -31,18 +58,19 @@ nv04_instobj_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
 {
        struct nv04_instmem_priv *priv = (void *)engine;
        struct nv04_instobj_priv *node;
-       int ret, align;
+       struct nouveau_instobj_args *args = data;
+       int ret;
 
-       align = (unsigned long)data;
-       if (!align)
-               align = 1;
+       if (!args->align)
+               args->align = 1;
 
        ret = nouveau_instobj_create(parent, engine, oclass, &node);
        *pobject = nv_object(node);
        if (ret)
                return ret;
 
-       ret = nouveau_mm_head(&priv->heap, 1, size, size, align, &node->mem);
+       ret = nouveau_mm_head(&priv->heap, 1, args->size, args->size,
+                             args->align, &node->mem);
        if (ret)
                return ret;
 
@@ -51,32 +79,9 @@ nv04_instobj_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
        return 0;
 }
 
-static void
-nv04_instobj_dtor(struct nouveau_object *object)
-{
-       struct nv04_instmem_priv *priv = (void *)object->engine;
-       struct nv04_instobj_priv *node = (void *)object;
-       nouveau_mm_free(&priv->heap, &node->mem);
-       nouveau_instobj_destroy(&node->base);
-}
-
-static u32
-nv04_instobj_rd32(struct nouveau_object *object, u64 addr)
-{
-       struct nv04_instobj_priv *node = (void *)object;
-       return nv_ro32(object->engine, node->mem->offset + addr);
-}
-
-static void
-nv04_instobj_wr32(struct nouveau_object *object, u64 addr, u32 data)
-{
-       struct nv04_instobj_priv *node = (void *)object;
-       nv_wo32(object->engine, node->mem->offset + addr, data);
-}
-
-struct nouveau_oclass
+struct nouveau_instobj_impl
 nv04_instobj_oclass = {
-       .ofuncs = &(struct nouveau_ofuncs) {
+       .base.ofuncs = &(struct nouveau_ofuncs) {
                .ctor = nv04_instobj_ctor,
                .dtor = nv04_instobj_dtor,
                .init = _nouveau_instobj_init,
@@ -173,5 +178,5 @@ nv04_instmem_oclass = &(struct nouveau_instmem_impl) {
                .rd32 = nv04_instmem_rd32,
                .wr32 = nv04_instmem_wr32,
        },
-       .instobj = &nv04_instobj_oclass,
+       .instobj = &nv04_instobj_oclass.base,
 }.base;
index fd866c4d441ab4f2114121949e061c4eaf6a973d..095fbc6fc099a852bfee334dea9aba389448adcb 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "priv.h"
 
-extern struct nouveau_oclass nv04_instobj_oclass;
+extern struct nouveau_instobj_impl nv04_instobj_oclass;
 
 struct nv04_instmem_priv {
        struct nouveau_instmem base;
index 02ea5e060c492afbdc3eb10a9f3d4f1788620a0e..ec0b9661d614ced3dec026e3460d3eeb07905f2e 100644 (file)
@@ -134,5 +134,5 @@ nv40_instmem_oclass = &(struct nouveau_instmem_impl) {
                .rd32 = nv40_instmem_rd32,
                .wr32 = nv40_instmem_wr32,
        },
-       .instobj = &nv04_instobj_oclass,
+       .instobj = &nv04_instobj_oclass.base,
 }.base;
index 57b7589b16fc46e400b681e4fbc1ec6099b13d63..7cb3b098a08d030d7d315a1642ebf6a167033ffe 100644 (file)
@@ -38,42 +38,9 @@ struct nv50_instobj_priv {
        struct nouveau_mem *mem;
 };
 
-static int
-nv50_instobj_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
-                 struct nouveau_oclass *oclass, void *data, u32 size,
-                 struct nouveau_object **pobject)
-{
-       struct nouveau_fb *pfb = nouveau_fb(parent);
-       struct nv50_instobj_priv *node;
-       u32 align = (unsigned long)data;
-       int ret;
-
-       size  = max((size  + 4095) & ~4095, (u32)4096);
-       align = max((align + 4095) & ~4095, (u32)4096);
-
-       ret = nouveau_instobj_create(parent, engine, oclass, &node);
-       *pobject = nv_object(node);
-       if (ret)
-               return ret;
-
-       ret = pfb->ram->get(pfb, size, align, 0, 0x800, &node->mem);
-       if (ret)
-               return ret;
-
-       node->base.addr = node->mem->offset;
-       node->base.size = node->mem->size << 12;
-       node->mem->page_shift = 12;
-       return 0;
-}
-
-static void
-nv50_instobj_dtor(struct nouveau_object *object)
-{
-       struct nv50_instobj_priv *node = (void *)object;
-       struct nouveau_fb *pfb = nouveau_fb(object);
-       pfb->ram->put(pfb, &node->mem);
-       nouveau_instobj_destroy(&node->base);
-}
+/******************************************************************************
+ * instmem object implementation
+ *****************************************************************************/
 
 static u32
 nv50_instobj_rd32(struct nouveau_object *object, u64 offset)
@@ -113,9 +80,46 @@ nv50_instobj_wr32(struct nouveau_object *object, u64 offset, u32 data)
        spin_unlock_irqrestore(&priv->lock, flags);
 }
 
-static struct nouveau_oclass
+static void
+nv50_instobj_dtor(struct nouveau_object *object)
+{
+       struct nv50_instobj_priv *node = (void *)object;
+       struct nouveau_fb *pfb = nouveau_fb(object);
+       pfb->ram->put(pfb, &node->mem);
+       nouveau_instobj_destroy(&node->base);
+}
+
+static int
+nv50_instobj_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
+                 struct nouveau_oclass *oclass, void *data, u32 size,
+                 struct nouveau_object **pobject)
+{
+       struct nouveau_fb *pfb = nouveau_fb(parent);
+       struct nouveau_instobj_args *args = data;
+       struct nv50_instobj_priv *node;
+       int ret;
+
+       args->size  = max((args->size  + 4095) & ~4095, (u32)4096);
+       args->align = max((args->align + 4095) & ~4095, (u32)4096);
+
+       ret = nouveau_instobj_create(parent, engine, oclass, &node);
+       *pobject = nv_object(node);
+       if (ret)
+               return ret;
+
+       ret = pfb->ram->get(pfb, args->size, args->align, 0, 0x800, &node->mem);
+       if (ret)
+               return ret;
+
+       node->base.addr = node->mem->offset;
+       node->base.size = node->mem->size << 12;
+       node->mem->page_shift = 12;
+       return 0;
+}
+
+static struct nouveau_instobj_impl
 nv50_instobj_oclass = {
-       .ofuncs = &(struct nouveau_ofuncs) {
+       .base.ofuncs = &(struct nouveau_ofuncs) {
                .ctor = nv50_instobj_ctor,
                .dtor = nv50_instobj_dtor,
                .init = _nouveau_instobj_init,
@@ -163,5 +167,5 @@ nv50_instmem_oclass = &(struct nouveau_instmem_impl) {
                .init = _nouveau_instmem_init,
                .fini = nv50_instmem_fini,
        },
-       .instobj = &nv50_instobj_oclass,
+       .instobj = &nv50_instobj_oclass.base,
 }.base;
index 17c7874f3ab7bacd1994fda2c99f3ac3350e0dc3..8d67dedc5bb23118fa06293f17ef20a80b3e6c31 100644 (file)
@@ -3,6 +3,32 @@
 
 #include <subdev/instmem.h>
 
+struct nouveau_instobj_impl {
+       struct nouveau_oclass base;
+};
+
+struct nouveau_instobj_args {
+       u32 size;
+       u32 align;
+};
+
+#define nouveau_instobj_create(p,e,o,d)                                        \
+       nouveau_instobj_create_((p), (e), (o), sizeof(**d), (void **)d)
+#define nouveau_instobj_destroy(p) ({                                          \
+       struct nouveau_instobj *iobj = (p);                                    \
+       _nouveau_instobj_dtor(nv_object(iobj));                                \
+})
+#define nouveau_instobj_init(p)                                                \
+       nouveau_object_init(&(p)->base)
+#define nouveau_instobj_fini(p,s)                                              \
+       nouveau_object_fini(&(p)->base, (s))
+
+int  nouveau_instobj_create_(struct nouveau_object *, struct nouveau_object *,
+                            struct nouveau_oclass *, int, void **);
+void _nouveau_instobj_dtor(struct nouveau_object *);
+#define _nouveau_instobj_init nouveau_object_init
+#define _nouveau_instobj_fini nouveau_object_fini
+
 struct nouveau_instmem_impl {
        struct nouveau_oclass base;
        struct nouveau_oclass *instobj;