Commit ab606194 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/instmem: tidy up the object class definition



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 24a4ae86
Loading
Loading
Loading
Loading
+0 −15
Original line number Diff line number Diff line
@@ -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;
+20 −27
Original line number Diff line number Diff line
@@ -24,6 +24,23 @@

#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
+36 −31
Original line number Diff line number Diff line
@@ -24,6 +24,33 @@

#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;
+1 −1
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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;
Loading